{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "finish\n",
      "finish\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import os\n",
    "import numpy as np\n",
    "import datetime\n",
    "import time\n",
    "# 1505145600  2017 年9月12\n",
    "\n",
    "times_zl = 1505145600\n",
    "\n",
    "def get_all_train_data():\n",
    "    df = pd.read_csv('../data/train/action_train.csv')\n",
    "    df = df.sort_values(by='actionTime',ascending=True)\n",
    "    return df\n",
    "def get_all_test_data():\n",
    "    df = pd.read_csv('../data/test/action_test.csv')\n",
    "    df = df.sort_values(by='actionTime',ascending=True)\n",
    "    return df\n",
    "\n",
    "def get_orderHistory(train):\n",
    "    if(train=='train'):\n",
    "        df = pd.read_csv('../data/train/orderHistory_train.csv')\n",
    "    else:\n",
    "        df = pd.read_csv('../data/test/orderHistory_test.csv')\n",
    "    df = df.sort_values(by=['orderTime','orderType'],ascending=[1,1])\n",
    "    df = df.drop_duplicates(['userid','orderTime'],keep='last')\n",
    "    return df  \n",
    "\n",
    "#上海，北京，广东，浙江，江苏，天津\n",
    "# 福建，山东，辽宁，四川，重庆，湖北，湖南，海南，内蒙古，山西\n",
    "# 河南，陕西，云南，黑龙江，安徽，贵州，宁夏，广西，吉林，江西，河北\n",
    "# 甘肃，新疆，青海，西藏\n",
    "def gender_map(x):\n",
    "    if x=='男':\n",
    "        return 1\n",
    "    elif x=='女':\n",
    "        return 2\n",
    "    else:\n",
    "        return 0 \n",
    "def age_map(x):\n",
    "    if x=='60后':\n",
    "        return 1\n",
    "    elif x=='70后':\n",
    "        return 2\n",
    "    elif x=='80后':\n",
    "        return 3\n",
    "    elif x=='90后':\n",
    "        return 4\n",
    "    elif x=='00后':\n",
    "        return 5\n",
    "    else:\n",
    "        return 0\n",
    "def province_map(x):\n",
    "    if x=='上海' or x== '北京' or x== '广东' or x== '浙江' or x== '江苏' or x== '天津' or x== '辽宁':\n",
    "        return 1\n",
    "    elif x=='福建' or x== '山东'  or x== '四川' or x== '重庆' or x== '湖北' or x== '湖南'  or x== '内蒙古' or x== '山西':\n",
    "        return 2\n",
    "    elif x=='河南' or x== '陕西' or x== '云南' or x== '黑龙江' or x== '安徽' or x== '广西' or x== '吉林' or x== '江西' or x== '河北':\n",
    "        return 3\n",
    "    elif x=='甘肃' or x== '新疆' or x== '青海' or x== '西藏' or x== '贵州' or x== '宁夏' or x== '海南':\n",
    "        return 4\n",
    "    else:\n",
    "        return 0\n",
    "def get_userprofile_map(train):\n",
    "    df = get_userProfile(train)\n",
    "    df['gender'] = df['gender'].map(gender_map)\n",
    "    df['age'] = df['age'].map(age_map)\n",
    "    df['province'] = df['province'].map(province_map)\n",
    "    return df\n",
    "def get_userProfile(train):\n",
    "    if(train=='train'):\n",
    "        df = pd.read_csv('../data/train/userProfile_train.csv')\n",
    "    else:\n",
    "        df = pd.read_csv('../data/test/userProfile_test.csv')\n",
    "    return df\n",
    "def last_1(x):\n",
    "    return x[-1:].mean()\n",
    "def last_2(x):\n",
    "    return x[-2:-1].mean()\n",
    "def last_3(x):\n",
    "    return x[-3:-2].mean()\n",
    "def first_1(x):\n",
    "    return x[:1].mean()\n",
    "def first_2(x):\n",
    "    return x[1:2].mean()\n",
    "def first_3(x):\n",
    "    return x[2:3].mean()\n",
    "def diff_mean(x):\n",
    "    x = x.diff()\n",
    "#     x = x/(3600*24)\n",
    "    return x.mean()\n",
    "def diff_min(x):\n",
    "    x = x.diff()\n",
    "#     x = x/(3600*24)\n",
    "    return x.min()\n",
    "def diff_max(x):\n",
    "    x = x.diff()\n",
    "#     x = x/(3600*24)\n",
    "    return x.max()\n",
    "def diff_std(x):\n",
    "    x = x.diff()\n",
    "#     x = x/(3600*24)\n",
    "    return x.std()\n",
    "def diff_last_1(x):\n",
    "    x = x.diff()\n",
    "#     x = x/(3600*24)\n",
    "    return x[-1:].mean()\n",
    "def diff_last_2(x):\n",
    "    x = x.diff()\n",
    "#     x = x/(3600*24)\n",
    "    return x[-2:-1].mean()\n",
    "def diff_last_3(x):\n",
    "    x = x.diff()\n",
    "#     x = x/(3600*24)\n",
    "    return x[-3:-2].mean()\n",
    "\n",
    "def diff_first_4(x):\n",
    "    x = x.diff()\n",
    "    return x[3:4].mean()\n",
    "\n",
    "def diff_first_2(x):\n",
    "    x = x.diff()\n",
    "    return x[1:2].mean()\n",
    "\n",
    "def diff_first_3(x):\n",
    "    x = x.diff()\n",
    "    return x[2:3].mean()\n",
    "\n",
    "def  diff_last_10_mean(x):\n",
    "    x = x.diff()\n",
    "#     x = x/(3600*24)\n",
    "    x = x[-10:]\n",
    "    return x.mean()\n",
    "def diff_last_10_std(x):\n",
    "    x = x.diff()\n",
    "#     x = x/(3600*24)\n",
    "    x = x[-10:]\n",
    "    return x.std()\n",
    "\n",
    "\n",
    "#获取用户开始三次、最后三次次订单的时间距离当前的时间和类型\n",
    "def get_feat_1(train):\n",
    "    dump_path = '../cache/get_feat_1_%s_2.csv'%train\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "        df['actionTime'] = 1505145600- df['actionTime']\n",
    "#         df['actionTime'] = df['actionTime']/(3600*24) \n",
    "#         actions = df[['userid','actionType','get_feat_1_actions']]\n",
    "        \n",
    "        actions_1 = df[['userid','actionType']].groupby(['userid'])['actionType']\\\n",
    "                    .agg({\n",
    "                        'feat_1_last_1_type':last_1,\n",
    "                        'feat_1_last_2_type':last_2,\n",
    "                        'feat_1_last_3_type':last_3,\n",
    "                        'feat_1_first_1_type':first_1,\n",
    "                        'feat_1_first_2_type':first_2,\n",
    "                        'feat_1_first_3_type':first_3\n",
    "                        \n",
    "                    })\n",
    "        actions_1 = actions_1.reset_index()\n",
    "#         print(actions_1.columns)\n",
    "        actions_2 = df[['userid','actionTime']].groupby(['userid'])['actionTime']\\\n",
    "                    .agg({\n",
    "                        'feat_1_last_1_time':last_1,\n",
    "                        'feat_1_last_2_time':last_2,\n",
    "                        'feat_1_last_3_time':last_3,\n",
    "                        'feat_1_first_1_time':first_1,\n",
    "                        'feat_1_first_2_time':first_2,\n",
    "                        'feat_1_first_3_time':first_3,\n",
    "                        \n",
    "                        \n",
    "                    })\n",
    "        actions_2 = actions_2.reset_index()\n",
    "#         print(actions_2.columns)\n",
    "        actions = pd.merge(actions_1,actions_2,on='userid',how='left')\n",
    "        actions.to_csv(dump_path,index=False)\n",
    "        return actions\n",
    "def get_feat_1_1(train):\n",
    "    dump_path = '../cache/get_feat_1_2_%s.csv'%train\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        df = get_feat_1(train)\n",
    "        df['get_feat_1_1_last_first_1'] = 0-df['feat_1_last_1_time']+df['feat_1_first_1_time']\n",
    "        df['get_feat_1_1_last_first_2'] = 0-df['feat_1_last_2_time']+df['feat_1_first_2_time']\n",
    "        df['get_feat_1_1_last_first_3'] = 0-df['feat_1_last_3_time']+df['feat_1_first_3_time']\n",
    "        df = df[['userid','get_feat_1_1_last_first_1','get_feat_1_1_last_first_2','get_feat_1_1_last_first_3']]\n",
    "        \n",
    "        df['rate_get_feat_1_1_last_first_2_1'] = df['get_feat_1_1_last_first_2']/df['get_feat_1_1_last_first_1']\n",
    "        df['rate_get_feat_1_1_last_first_3_1'] = df['get_feat_1_1_last_first_3']/df['get_feat_1_1_last_first_1']\n",
    "        df.to_csv(dump_path,index=False)\n",
    "        return df\n",
    "#获取每个type的个数和比例     \n",
    "def get_feat_2(train):\n",
    "    dump_path='../cache/get_feat_2_%s.csv'%train\n",
    "    if  os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "        actions_1 = pd.get_dummies(df['actionType'],prefix='actions_2_type')\n",
    "        actions = pd.concat([df[['userid']],actions_1],axis=1)\n",
    "        actions = actions.groupby(['userid'],as_index=False).sum()\n",
    "        actions['actions_2_type']=0\n",
    "        for i in range(1,10,1):\n",
    "            actions['actions_2_type']=actions['actions_2_type']+actions['actions_2_type_'+str(i)]\n",
    "        for i in range(1,10,1):\n",
    "            actions['actions_2_type_rate_'+str(i)]=actions['actions_2_type_'+str(i)]/actions['actions_2_type']\n",
    "#             del actions['actions_2_type_'+str(i)]\n",
    "        actions.to_csv(dump_path,index=False)\n",
    "        return actions\n",
    "def diff_first_1(x):\n",
    "    return x[1:2].mean()\n",
    "\n",
    "def diff_first_2(x):\n",
    "    return x[2:3].mean()\n",
    "\n",
    "def diff_first_3(x):\n",
    "    x =x.diff()\n",
    "    return x[3:4].mean()\n",
    "#获取相邻时间的方差和均值\n",
    "def get_feat_3(train):\n",
    "    dump_path ='../cache/get_feat_3_%s_1.csv'%train\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "        actions = df[['userid','actionTime']].groupby(['userid'])['actionTime'].agg({\n",
    "                                                                      'feat_3_mean':diff_mean,\n",
    "                                                                      'feat_3_std':diff_std,\n",
    "#                                                                       'feat_3_max':diff_max,\n",
    "                                                                      'feat_3_min':diff_min,\n",
    "                                                                      'feat_3_last_1':diff_last_1,\n",
    "                                                                      'feat_3_last_2':diff_last_2,\n",
    "                                                                      'feat_3_last_3':diff_last_3,\n",
    "            \n",
    "                                                                      'feat_3_first_1': diff_first_1,\n",
    "                                                                      'feat_3_first_2': diff_first_2,\n",
    "                                                                      'feat_3_first_3': diff_first_3,\n",
    "            \n",
    "                                                                     \n",
    "                                                                    })\n",
    "        actions = actions.reset_index()\n",
    "        actions.to_csv(dump_path,index=False)\n",
    "        return actions\n",
    "#获取每个状态的相邻时间的均值和时间\n",
    "def get_feat_4(train):\n",
    "    dump_path='../cache/get_feat_4_%s_zl_1_1.csv'%train\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "\n",
    "        df=df[(df['actionType']==1) | (df['actionType']==5) |(df['actionType']==6)|(df['actionType']==7)]\n",
    "        df = df[['userid','actionType','actionTime']].groupby(['userid','actionType'])['actionTime']\\\n",
    "                                                            .agg({\n",
    "                                                                  'feat_4_mean':diff_mean,\n",
    "                                                                  'feat_4_std':diff_std,\n",
    "    #                                                           \n",
    "                                                                  'feat_4_min':diff_min,\n",
    "                                                                  'feat_4_last_1':diff_last_1,\n",
    "                                                                  'feat_4_first_1': diff_first_1,\n",
    "                                                                \n",
    "                                                                 'feat_4_last_1_time':last_1,\n",
    "                                                                'feat_4_last_2_time':last_2,\n",
    "                                                                'feat_4_last_3_time':last_3,\n",
    "                                                                'feat_4_first_1_time':first_1,\n",
    "                                                                'feat_4_first_1_time':first_1,\n",
    "                                                                'feat_4_first_1_time':first_1,\n",
    "                                                            })\n",
    "        df = df.unstack()\n",
    "        columns=[]\n",
    "        for i in df.columns.levels[0]:\n",
    "            for j in  df.columns.levels[1]:\n",
    "                columns.append(str(i)+'_'+str(j))\n",
    "        df.columns = columns\n",
    "        df = df.reset_index() \n",
    "        df.to_csv(dump_path,index=False)\n",
    "        return df\n",
    "def get_feat_5(train):\n",
    "    dump_path='../cache/get_feat_5_%s_zl.csv'%train\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "        df=df[(df['actionType']==1) | (df['actionType']==5) |(df['actionType']==6)|(df['actionType']==7)]\n",
    "#         df = df[ (df['actionType']==5) ]\n",
    "        df = df[['userid','actionType','actionTime']].groupby(['userid','actionType'])['actionTime']\\\n",
    "            .agg({\n",
    "               'feat_5_mean':diff_last_3_mean,\n",
    "               'feat_5_std':diff_last_3_std\n",
    "#                'feat_5_std':diff_std,\n",
    "#                'feat_5_last':diff_last_1\n",
    "            })\n",
    "        df = df.unstack()\n",
    "        columns=[]\n",
    "        for i in df.columns.levels[0]:\n",
    "            for j in  df.columns.levels[1]:\n",
    "                columns.append(str(i)+'_'+str(j))\n",
    "        df.columns = columns\n",
    "        df = df.reset_index()\n",
    "        df.to_csv(dump_path,index=False)\n",
    "        return df\n",
    "    \n",
    "def get_feat_8(train):\n",
    "    dump_path = '../cache/get_feat_8_%s_5.csv'%train\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "        df=df[(df['actionType']==1) | (df['actionType']==5) |(df['actionType']==6)|(df['actionType']==7)]\n",
    "        df['actionTime'] = 1505145600- df['actionTime']\n",
    "#         df['actionTime'] = df['actionTime']/(3600*24)\n",
    "\n",
    "        df = df[['userid','actionType','actionTime']].groupby(['userid','actionType'])['actionTime']\\\n",
    "                    .agg({\n",
    "                        'feat_8_last_1_time':last_1,\n",
    "#                         'feat_8_last_2_time':last_2,\n",
    "#                         'feat_8_last_3_time':last_3,\n",
    "#                         'feat_8_first_1_time':first_1,\n",
    "#                         'feat_8_first_2_time':first_2,\n",
    "#                         'feat_8_first_3_time':first_3\n",
    "                    })\n",
    "            \n",
    "        df = df.unstack()\n",
    "        columns=[]\n",
    "        for i in df.columns.levels[0]:\n",
    "            for j in  df.columns.levels[1]:\n",
    "                columns.append(str(i)+'_'+str(j))\n",
    "        df.columns = columns\n",
    "        df = df.reset_index()\n",
    "#         print(actions_2.columns)\n",
    "        df.to_csv(dump_path,index=False)\n",
    "        return df\n",
    "    \n",
    "    \n",
    "    \n",
    "def get_feat_9(train):\n",
    "    dump_path='../cache/get_feat_9_%s.csv'%train\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()  \n",
    "       \n",
    "        df_1 = get_orderHistory(train)\n",
    "        df_1 = df_1[['userid','orderTime']].drop_duplicates(['userid'],keep='last')\n",
    "        df_1.columns=['userid','start_time']\n",
    "\n",
    "        actions = pd.merge(df,df_1,on=['userid'],how='left')\n",
    "        actions = actions[actions['actionTime']>actions['start_time']]\n",
    "        actions = actions[['userid','actionTime']].groupby(['userid'])['actionTime']\\\n",
    "                    .agg({\n",
    "                       'feat_9_mean':feat_3_mean,\n",
    "                       'feat_9_min':feat_3_min,\n",
    "                       'feat_9_max':feat_3_max,\n",
    "                       'feat_9_std':feat_3_std,\n",
    "                    })\n",
    "#         actions = actions.unstack()\n",
    "#         actions.columns = ['get_feat_9_'+str(i+1) for i in range(len(actions.columns))]\n",
    "        actions = actions.reset_index()\n",
    "        actions.to_csv(dump_path,index=False)\n",
    "        return actions   \n",
    "    \n",
    "def get_feat_6(train):\n",
    "    dump_path='../cache/get_feat_6_%s_1.csv'%train\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        df = get_orderHistory(train)\n",
    "        df_1 = df[df['orderType']==0][['userid','orderTime']].groupby(['userid'],as_index=False).count()\n",
    "        df_1.columns = ['userid','order_0_nums']\n",
    "        \n",
    "        df_2 = df[df['orderType']==1][['userid','orderTime']].groupby(['userid'],as_index=False).count()\n",
    "        df_2.columns = ['userid','order_1_nums'] \n",
    "        \n",
    "        actions = pd.merge(df_1,df_2,on='userid',how='left')\n",
    "        actions['rate_oreder_1'] = actions['order_1_nums']/(actions['order_0_nums'] +actions['order_1_nums'])\n",
    "        actions = actions.fillna(0)\n",
    "        actions.to_csv(dump_path,index=False)\n",
    "        return actions\n",
    "#\n",
    "def get_feat_7(train):\n",
    "    dump_path='../cache/get_feat_7_%s.csv'%train\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        df = get_orderHistory(train)   \n",
    "        df_1 = df[df['orderType']==0][['userid','orderTime']].drop_duplicates(['userid'],keep='last')\n",
    "        df_1['orderTime'] = (1505145600-df_1['orderTime'])\n",
    "        df_1.columns =['userid','time_interval_7_0']\n",
    "        \n",
    "        df_2 = df[df['orderType']==1][['userid','orderTime']].drop_duplicates(['userid'],keep='last')\n",
    "        df_2['orderTime'] = (1505145600-df_2['orderTime'])\n",
    "        df_2.columns =['userid','time_interval_7_1']\n",
    "        \n",
    "\n",
    "        actions = pd.merge(df_1,df_2,on='userid',how='outer')\n",
    "#         actions = pd.merge(actions,df_3,on='userid',how='outer')\n",
    "#         actions = pd.merge(actions,df_4,on='userid',how='outer')\n",
    "        actions.to_csv(dump_path,index=False)\n",
    "        return actions\n",
    "    \n",
    "def get_feat_13(train):\n",
    "    dump_path='../cache/get_feat_13_%s_1.csv'%(train)\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "        df = df[['userid','actionTime']].groupby(['userid'])['actionTime'].agg({'get_feat_13_mean':diff_last_10_mean,\n",
    "                                                                                'get_feat_13_std':diff_last_10_std})                               \n",
    "        df = df.reset_index()                                        \n",
    "\n",
    "        df.to_csv(dump_path,index=False)\n",
    "        return df\n",
    "    \n",
    "    \n",
    "def get_feat_20(train):\n",
    "    dump_path='../cache/get_feat_20_%s_zl——1.csv'%train\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()   \n",
    "#         df=df[(df['actionType']==1) | (df['actionType']==5) |(df['actionType']==6)|(df['actionType']==7)]    \n",
    "        df_1 = df.drop_duplicates(['userid','actionType'],keep='last')[['userid','actionType','actionTime']]\n",
    "        df_1.columns = ['userid','actionType_last','actionTime_last']\n",
    "        df = pd.merge(df,df_1,on=['userid'],how='left')\n",
    "        df = df[df['actionTime']>df['actionTime_last']]\n",
    "        \n",
    "        df= df[['userid','actionType_last','actionTime']].groupby(['userid','actionType_last'])['actionTime']\\\n",
    "                                        .agg({\n",
    "                                             'feat_20_mean':diff_mean,\n",
    "                                              'feat_20_std':diff_std,\n",
    "#                                               'feat_20_max':diff_max,\n",
    "                                              'feat_20_min':diff_min\n",
    "                                        })\n",
    "        \n",
    "        \n",
    "        \n",
    "#         df = df.reset_index()\n",
    "        df = df.unstack()\n",
    "        columns=[]\n",
    "        for i in df.columns.levels[0]:\n",
    "            for j in  df.columns.levels[1]:\n",
    "                columns.append(str(i)+'_'+str(j))\n",
    "        df.columns = columns\n",
    "        df = df.reset_index()\n",
    "#         print(df)\n",
    "        df.to_csv(dump_path,index=False)\n",
    "        return df\n",
    "def get_feat_21(train):\n",
    "    dump_path='../cache/get_feat_21_%s_1.csv'%train\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        df = get_orderHistory(train)\n",
    "        df = df[df['orderType']==1][['userid','orderType']].groupby(['userid'],as_index=False).count()\n",
    "        df.columns = ['userid','nums_label_1']\n",
    "        \n",
    "        if(train=='train'):\n",
    "            actions = get_all_train_data()\n",
    "        else:\n",
    "            actions = get_all_test_data()\n",
    "        actions_1 = pd.get_dummies(actions['actionType'],prefix='actions_21_type')\n",
    "        actions = pd.concat([actions[['userid']],actions_1],axis=1)\n",
    "        actions = actions.groupby(['userid'],as_index=False).sum()\n",
    "        actions = pd.merge(df,actions,on='userid',how='left')\n",
    "        for i in range(1,10,1):\n",
    "            actions['actions_21_type_rate_'+str(i)]=actions['nums_label_1']/actions['actions_21_type_'+str(i)]\n",
    "            del actions['actions_21_type_'+str(i)]\n",
    "        del actions['nums_label_1']\n",
    "        actions.to_csv(dump_path,index=False)\n",
    "        return actions\n",
    "\n",
    "\n",
    "    \n",
    "def get_feat_22_1567(train):\n",
    "    dump_path='../cache/get_feat_22_%s_2_1.csv'%train\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "        df=df[(df['actionType']==1) | (df['actionType']==5) |(df['actionType']==6)|(df['actionType']==7)] \n",
    "        df['date'] = df['actionTime'].map(lambda x:datetime.datetime.utcfromtimestamp(x).strftime('%Y-%m-%d'))\n",
    "        actions_1 = df[['date','userid']].groupby('userid',as_index=False).count()\n",
    "        actions_1.columns =['userid','nums_all']\n",
    "        \n",
    "#         actions_2 = df[['date','userid']].groupby('userid',as_index=False).count()\n",
    "        actions_2 = df[['date','userid']].drop_duplicates(['date','userid'],keep='last')\n",
    "        actions_2 = actions_2[['date','userid']].groupby('userid',as_index=False).count()\n",
    "        actions_2.columns =['userid','day_nums']\n",
    "        \n",
    "        actions = pd.merge(actions_1,actions_2,on='userid',how='left')\n",
    "        actions['rate_22_1']= actions['nums_all']/actions['day_nums']\n",
    "        del actions['nums_all']\n",
    "        actions.to_csv(dump_path,index=False)\n",
    "        return actions\n",
    "    \n",
    "def get_feat_22(train):\n",
    "    dump_path='../cache/get_feat_22_%s_2.csv'%train\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "        df['date'] = df['actionTime'].map(lambda x:datetime.datetime.utcfromtimestamp(x).strftime('%Y-%m-%d'))\n",
    "        actions_1 = df[['date','userid']].groupby('userid',as_index=False).count()\n",
    "        actions_1.columns =['userid','nums_all']\n",
    "        \n",
    "#         actions_2 = df[['date','userid']].groupby('userid',as_index=False).count()\n",
    "        actions_2 = df[['date','userid']].drop_duplicates(['date','userid'],keep='last')\n",
    "        actions_2 = actions_2[['date','userid']].groupby('userid',as_index=False).count()\n",
    "        actions_2.columns =['userid','day_nums']\n",
    "        \n",
    "        actions = pd.merge(actions_1,actions_2,on='userid',how='left')\n",
    "        actions['rate_22_1']= actions['nums_all']/actions['day_nums']\n",
    "        del actions['nums_all']\n",
    "        actions.to_csv(dump_path,index=False)\n",
    "        return actions\n",
    "    \n",
    "def get_feat_23(train):\n",
    "    dump_path='../cache/get_feat_23_%s_2.csv'%train\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "        df=df[(df['actionType']==1) | (df['actionType']==5) |(df['actionType']==6)|(df['actionType']==7)]   \n",
    "        df['date'] = df['actionTime'].map(lambda x:datetime.datetime.utcfromtimestamp(x).strftime('%Y-%m-%d'))\n",
    "        actions_1 = df[['date','userid','actionType']].groupby(['userid','actionType']).count()\n",
    "        actions_1 = actions_1.unstack()\n",
    "        columns=[]\n",
    "        for i in actions_1.columns.levels[0]:\n",
    "            for j in  actions_1.columns.levels[1]:\n",
    "                columns.append(str(i)+'_'+str(j)+\"_nums\")\n",
    "        actions_1.columns = columns\n",
    "        actions_1 =actions_1.reset_index()\n",
    "#         actions_2 = df[['date','userid']].groupby('userid',as_index=False).count()\n",
    "        actions_2 = df[['date','userid','actionType']].drop_duplicates(['date','userid','actionType'],keep='last')\n",
    "        actions_2 = actions_2[['date','userid','actionType']].groupby(['userid','actionType']).count()\n",
    "        actions_2 = actions_2.unstack()\n",
    "        columns=[]\n",
    "        \n",
    "        cols_x =actions_2.columns.levels[0]\n",
    "        cols_y =actions_2.columns.levels[1]\n",
    "        for i in actions_2.columns.levels[0]:\n",
    "            for j in  actions_2.columns.levels[1]:\n",
    "                columns.append(str(i)+'_'+str(j)+\"_days\")\n",
    "        actions_2.columns = columns\n",
    "        actions_2 = actions_2.reset_index()\n",
    "        actions = pd.merge(actions_1,actions_2,on=['userid'],how='left')\n",
    "        for i in cols_x:\n",
    "            for j in  cols_y:\n",
    "                actions[str(i)+'_'+str(j)+'rate_22_1']= actions[str(i)+'_'+str(j)+\"_nums\"]/actions[str(i)+'_'+str(j)+\"_days\"]\n",
    "                del actions[str(i)+'_'+str(j)+\"_nums\"]\n",
    "        actions.to_csv(dump_path,index=False)\n",
    "        return actions\n",
    "    \n",
    "\n",
    "def get_feat_26(train):\n",
    "    dump_path='../cache/get_feat_26_%s_2.csv'%train\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "#         df=df.head(100)\n",
    "        df=df[(df['actionType']==1) | (df['actionType']==5) |(df['actionType']==6)|(df['actionType']==7)] \n",
    "        df['date'] = df['actionTime'].map(lambda x:datetime.datetime.utcfromtimestamp(x).strftime('%Y-%m-%d'))\n",
    "        actions_1 = df[['date','actionType','userid']].groupby(['userid','actionType'],as_index=False).count()\n",
    "        actions_1.columns =['userid','actionType','nums_all_26']\n",
    "        \n",
    "#         actions_2 = df[['date','userid']].groupby('userid',as_index=False).count()\n",
    "        actions_2 = df[['date','actionType','userid']].drop_duplicates(['date','actionType','userid'],keep='last')\n",
    "        actions_2 = actions_2[['date','actionType','userid']].groupby(['userid','actionType'],as_index=False).count()\n",
    "        actions_2.columns =['userid','actionType','day_nums_26']\n",
    "        \n",
    "        actions = pd.merge(actions_1,actions_2,on=['userid','actionType'],how='left')\n",
    "        actions['rate_26_1']= actions['nums_all_26']/actions['day_nums_26']\n",
    "        del actions['nums_all_26']\n",
    "        actions = actions.groupby(['userid','actionType']).mean()\n",
    "        actions = actions.unstack()\n",
    "        columns=[]\n",
    "        for i in actions.columns.levels[0]:\n",
    "            for j in  actions.columns.levels[1]:\n",
    "                columns.append(str(i)+'_'+str(j)+\"_nums\")\n",
    "        actions.columns = columns\n",
    "        actions =actions.reset_index()\n",
    "#         print(actions.head(20))\n",
    "#         print(actions.columns)\n",
    "        \n",
    "        actions.to_csv(dump_path,index=False)\n",
    "        return actions\n",
    "def get_feat_27(train):\n",
    "    dump_path='../cache/get_feat_27_%s_10.csv'%train\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "#         df=df.head(100)\n",
    "        df_1 = df[df['actionType']==5].drop_duplicates(['userid'],keep='last')[['userid','actionTime']]\n",
    "        df_1.columns = ['userid','actionTime_5_last']\n",
    "        df=df[(df['actionType']==1) |(df['actionType']==6)|(df['actionType']==7)] \n",
    "#         df =  df[df['actionType']!=5]\n",
    "        df= df.drop_duplicates(['userid','actionType'],keep='last')\n",
    "       \n",
    "        df = pd.merge(df,df_1,on='userid',how='left') \n",
    "#         print(df.columns)\n",
    "#         df = df[df['actionTime']>=df['actionTime_5_last']]\n",
    "        df['get_feat_27_chazhi'] =df['actionTime'] - df['actionTime_5_last']\n",
    "        \n",
    "        df = df[['userid','actionType','get_feat_27_chazhi']].groupby(['userid','actionType']).sum()\n",
    "        \n",
    "        df = df.unstack()\n",
    "        columns =[]\n",
    "        for i in df.columns.levels[0]:\n",
    "            for j in  df.columns.levels[1]:\n",
    "                columns.append(str(i)+'_'+str(j)+\"_nums\")\n",
    "        \n",
    "        df.columns =columns\n",
    "        df =df.reset_index()\n",
    "#         print(actions.head(20))\n",
    "#         print(actions.columns)\n",
    "        \n",
    "        df.to_csv(dump_path,index=False)\n",
    "        return df\n",
    "    \n",
    "def get_feat_28(train):\n",
    "    dump_path='../cache/get_feat_28_%s_8.csv'%train\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "#         df=df.head(100)\n",
    "        df_1 = df[df['actionType']==5][['userid','actionTime']]\n",
    "        df_1.columns = ['userid','actionTime_5_28_last']\n",
    "        df=df[(df['actionType']==1) |(df['actionType']==6)|(df['actionType']==7)] \n",
    "#         df =  df[df['actionType']!=5]\n",
    "#         df= df.drop_duplicates(['userid','actionType'],keep='last')\n",
    "        df = pd.merge(df,df_1,on='userid',how='left') \n",
    "#         print(df.columns)\n",
    "        df = df[df['actionTime']>=df['actionTime_5_28_last']]\n",
    "        df['get_feat_28_chazhi'] =df['actionTime'] - df['actionTime_5_28_last']\n",
    "        df = df[df['get_feat_28_chazhi']<60*5]\n",
    "        df = df[['userid','actionType','get_feat_28_chazhi']].groupby(['userid','actionType']).sum()\n",
    "        \n",
    "        df = df.unstack()\n",
    "        columns =[]\n",
    "        for i in df.columns.levels[0]:\n",
    "            for j in  df.columns.levels[1]:\n",
    "                columns.append(str(i)+'_'+str(j)+\"_nums\")\n",
    "        \n",
    "        df.columns =columns\n",
    "        df =df.reset_index()\n",
    "#         print(actions.head(20))\n",
    "#         print(actions.columns)\n",
    "        \n",
    "        df.to_csv(dump_path,index=False)\n",
    "        return df\n",
    "# def get_feat_29(train):\n",
    "#     dump_path='../cache/get_feat_29_%s_9.csv'%train\n",
    "#     if os.path.exists(dump_path):\n",
    "#         actions = pd.read_csv(dump_path)\n",
    "#         return actions\n",
    "#     else:\n",
    "#         if(train=='train'):\n",
    "#             df = get_all_train_data()\n",
    "#         else:\n",
    "#             df = get_all_test_data()\n",
    "# #         df=df.head(100)\n",
    "#         df_1 = df[df['actionType']==5][['userid','actionTime']]\n",
    "#         df_1.columns = ['userid','actionTime_5_28_last']\n",
    "#         df=df[(df['actionType']==1) |(df['actionType']==6)|(df['actionType']==7)] \n",
    "# #         df =  df[df['actionType']!=5]\n",
    "# #         df= df.drop_duplicates(['userid','actionType'],keep='last')\n",
    "#         df = pd.merge(df,df_1,on='userid',how='left') \n",
    "# #         print(df.columns)\n",
    "#         df = df[df['actionTime']>=df['actionTime_5_28_last']]\n",
    "#         df['get_feat_28_chazhi'] =df['actionTime'] - df['actionTime_5_28_last']\n",
    "#         df = df[df['get_feat_28_chazhi']<60*5]\n",
    "#         df = df[['userid','actionType','get_feat_28_chazhi']].groupby(['userid','actionType']).sum()\n",
    "        \n",
    "#         df = df.unstack()\n",
    "#         columns =[]\n",
    "#         for i in df.columns.levels[0]:\n",
    "#             for j in  df.columns.levels[1]:\n",
    "#                 columns.append(str(i)+'_'+str(j)+\"_nums\")\n",
    "        \n",
    "#         df.columns =columns\n",
    "#         df =df.reset_index()\n",
    "# #         print(actions.head(20))\n",
    "# #         print(actions.columns)\n",
    "        \n",
    "#         df.to_csv(dump_path,index=False)\n",
    "#         return df\n",
    "def get_feat_30(train):\n",
    "    dump_path='../cache/get_feat_30_%s_9.csv'%train\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "#         df=df.head(100)\n",
    "        df_1 = df.drop_duplicates(['userid'],keep='last')[['userid','actionTime']]\n",
    "        df_1.columns = ['userid','actionTime_30_last']\n",
    "#         df_2 = df[(df['actionType']==2)|(df['actionType']==3)|(df['actionType']==4)] \n",
    "    \n",
    "        df=df[(df['actionType']==1)|(df['actionType']==5)|(df['actionType']==6)|(df['actionType']==7)] \n",
    "        df = df.drop_duplicates(['userid','actionType'],keep='last')\n",
    "#         df= df.drop_duplicates(['userid','actionType'],keep='last')\n",
    "        df = pd.merge(df,df_1,on='userid',how='left') \n",
    "#         print(df.columns)\n",
    "        \n",
    "        df['get_feat_30_chazhi'] =(df['actionTime_30_last'] - df['actionTime'])\n",
    "        df = df[['userid','actionType','get_feat_30_chazhi']].groupby(['userid','actionType']).sum()\n",
    "        \n",
    "        df = df.unstack()\n",
    "        columns =[]\n",
    "        for i in df.columns.levels[0]:\n",
    "            for j in  df.columns.levels[1]:\n",
    "                columns.append(str(i)+'_'+str(j)+\"_nums\")\n",
    "        \n",
    "        df.columns =columns\n",
    "        df =df.reset_index()\n",
    "#         print(actions.head(20))\n",
    "#         print(actions.columns)\n",
    "        \n",
    "        df.to_csv(dump_path,index=False)\n",
    "        return df\n",
    "    \n",
    "\n",
    "print(\"finish\")    \n",
    "\n",
    "print(\"finish\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "finish\n"
     ]
    }
   ],
   "source": [
    "def city_map(x):\n",
    "    if x =='新加坡' or x == '东京':\n",
    "        return 1\n",
    "    elif x=='纽约' or x=='台北' or x=='吉隆坡' or x=='悉尼' or x=='香港' or x=='大阪':\n",
    "        return 2\n",
    "    elif x=='墨尔本' or x=='曼谷' or x=='伦敦' or x=='洛杉矶' or x=='巴厘岛' or x=='普吉岛' or x=='首尔' or x=='旧金山' or x=='清迈' or x=='京都' or x=='巴黎':\n",
    "        return 3\n",
    "    else:\n",
    "        return 0\n",
    "\n",
    "def country_map(x):\n",
    "    if x =='日本' or x == '美国' or x == '澳大利亚':\n",
    "        return 1\n",
    "    elif  x =='新加坡' or x == '泰国' or x == '马来西亚' or  x =='中国台湾' or x == '中国香港' :\n",
    "        return 2\n",
    "    elif  x =='法国' or x == '英国' or x == '韩国' or  x =='印度尼西亚' or x == '加拿大' or x =='意大利' or x == '西班牙' or x == '新西兰' or  x =='越南' or x == '阿联酋':\n",
    "        return 3\n",
    "    else:\n",
    "        return 0\n",
    "def continent_map(x):\n",
    "    if x == '亚洲':\n",
    "        return 1\n",
    "    elif x == '北美洲':\n",
    "        return 2\n",
    "    elif x == '大洋洲':\n",
    "        return 3\n",
    "    else:\n",
    "        return 0\n",
    "\n",
    "    \n",
    "def get_feat_001(train):\n",
    "    dump_path='../cache/get_feat_001_%s_9.csv'%train\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        df = get_orderHistory(train)\n",
    "        df['city'] = df['city'].map(city_map)\n",
    "        df['country'] = df['country'].map(country_map)\n",
    "        df['continent'] = df['continent'].map(continent_map)\n",
    "        df_1 = pd.get_dummies(df['city'],prefix='city')\n",
    "        df_2 = pd.get_dummies(df['country'],prefix='country')\n",
    "        df_3 =  pd.get_dummies(df['continent'],prefix='continent')\n",
    "        \n",
    "        df = pd.concat([df[['userid']],df_1,df_2,df_3],axis=1)\n",
    "        \n",
    "        df = df.groupby(['userid'],as_index=False).sum()\n",
    "        \n",
    "        df.to_csv(dump_path,index=False)\n",
    "        return df\n",
    "def get_feat_002(train):\n",
    "    dump_path='../cache/get_feat_002_%s.csv'%train\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "        df_1 = get_orderHistory(train)\n",
    "        print(df_1.columns)\n",
    "        df = df[['userid','actionTime']].drop_duplicates(['userid'],keep='last')\n",
    "        \n",
    "        df_1 = df_1[['userid','orderTime']].drop_duplicates(['userid'],keep='last')\n",
    "        df = pd.merge(df,df_1,on='userid',how='left')\n",
    "#         df = df[df['actionTime']>=df['orderTime']]\n",
    "        df['get_feat_002'] = df['actionTime'] - df['orderTime']\n",
    "        df[['userid','get_feat_002']].to_csv(dump_path,index=False)\n",
    "        return df[['userid','get_feat_002']]\n",
    "# def get_feat_003(train):\n",
    "#     dump_path='../cache/get_feat_002_%s_9.csv'%train\n",
    "#     if os.path.exists(dump_path):\n",
    "#         actions = pd.read_csv(dump_path)\n",
    "#         return actions\n",
    "#     else:\n",
    "def get_feat_003(train):\n",
    "    dump_path='../cache/get_feat_003_%s——2.csv'%train\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "            \n",
    "        df['time'] = df['actionTime'].map( lambda x: datetime.datetime.utcfromtimestamp(x))\n",
    "        df['day'] = df['time'].map( lambda x: x.isocalendar()[1]*7+x.isocalendar()[2])\n",
    "        df['day'] = df['day']+ (df['time'].dt.year-2016)*356\n",
    "        \n",
    "        \n",
    "#         df['month'] = df['time'].dt.month\n",
    "        \n",
    "        df_1 = df[['userid','day']].drop_duplicates(['userid'],keep='last')\n",
    "        \n",
    "        df  =  df[['userid','day','actionTime']].groupby(['userid','day'],as_index=False).count()\n",
    "        \n",
    "        df.columns = ['userid','day','same_day']\n",
    "        \n",
    "        df = pd.merge(df_1,df,on = ['userid','day'],how='left')\n",
    "#         del df['month']\n",
    "        del df['day']\n",
    "        df.to_csv(dump_path,index=False)\n",
    "        return df\n",
    "\n",
    "def get_feat_004(train):\n",
    "    dump_path='../cache/get_feat_004_%s——2.csv'%train\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "            \n",
    "        df['time'] = df['actionTime'].map( lambda x: datetime.datetime.utcfromtimestamp(x))\n",
    "        df['day'] = df['time'].map( lambda x: x.isocalendar()[1]*7+x.isocalendar()[2])\n",
    "        df['day'] = df['day']+ (df['time'].dt.year-2016)*356\n",
    "\n",
    "        \n",
    "        df_1 = df[['userid','day']].drop_duplicates(['userid'],keep='last')\n",
    "        \n",
    "        df  =  df[['userid','day']].groupby(['userid'])['day'].agg({\n",
    "                                                        'get_feat_004_last_1':diff_last_1,\n",
    "                                                        'get_feat_004_last_2':diff_last_2\n",
    "                                                        \n",
    "                                                })\n",
    "#         df['get_feat_004_last_1'] = (df['get_feat_004_last_1']+30)%30\n",
    "#         df['get_feat_004_last_2'] = (df['get_feat_004_last_2']+30)%30\n",
    "#         print(df)\n",
    "#         df = df.unstack()\n",
    "#         columns =[]\n",
    "#         for i in df.columns.levels[0]:\n",
    "#             for j in  df.columns.levels[1]:\n",
    "#                 columns.append(str(i)+'_'+str(j)+\"_nums\")\n",
    "        \n",
    "#         df.columns =columns\n",
    "        df =df.reset_index()\n",
    "#         del df['month']\n",
    "       \n",
    "        df.to_csv(dump_path,index=False)\n",
    "        return df\n",
    "def get_feat_006(train):\n",
    "    dump_path='../cache/get_feat_006_%s——3.csv'%train\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "            \n",
    "        df['date'] = df['actionTime'].map(lambda x:datetime.datetime.utcfromtimestamp(x).strftime('%Y-%m-%d'))\n",
    "        df['time'] = df['actionTime'].map( lambda x: datetime.datetime.utcfromtimestamp(x))\n",
    "        df['day'] = df['time'].map( lambda x: x.isocalendar()[1]*7+x.isocalendar()[2])\n",
    "        df['day'] = df['day']+ (df['time'].dt.year-2016)*356\n",
    "        # print(df)\n",
    "        df = df[df['actionType']==5]\n",
    "        df  =  df[['userid','day','actionTime']].groupby(['userid','day'],as_index=False)['actionTime'].agg({\n",
    "                                                                'get_feat_006':last_sub_fisrt,\n",
    "\n",
    "\n",
    "                                                        })\n",
    "        df  =  df[['userid','get_feat_006']].groupby(['userid'],as_index=False).mean()\n",
    "\n",
    "        df.to_csv(dump_path,index=False)\n",
    "        return df  \n",
    "def last_sub_fisrt(x):\n",
    "    return x[-1:].mean()-x[:1].mean()\n",
    "def get_nums(x):\n",
    "    return x.shape[0]\n",
    "def get_feat_007(train):\n",
    "    dump_path='../cache/get_feat_007_%s——1.csv'%train\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "            \n",
    "        df['date'] = df['actionTime'].map(lambda x:datetime.datetime.utcfromtimestamp(x).strftime('%Y-%m-%d'))\n",
    "        df['time'] = df['actionTime'].map( lambda x: datetime.datetime.utcfromtimestamp(x))\n",
    "        df['day'] = df['time'].map( lambda x: x.isocalendar()[1]*7+x.isocalendar()[2])\n",
    "        df['day'] = df['day']+ (df['time'].dt.year-2016)*356\n",
    "        # print(df)\n",
    "        df['actionTime'] = 1505145600- df['actionTime']\n",
    "        df_1 = df.drop_duplicates(['userid','day'],keep='last')[['userid','day']]\n",
    "        df_1 = pd.merge(df_1,df,on=['userid','day'],how='left')\n",
    "        actions_1  =  df_1[['userid','actionTime']].groupby(['userid'],as_index=False)['actionTime'].agg({\n",
    "                                                                'get_feat_007_first_last':last_sub_fisrt,\n",
    "                                                                'get_feat_007_nums':get_nums,\n",
    "                                                                'get_feat_007_diff_mean':diff_mean,\n",
    "                                                                'get_feat_007_diff_std':diff_std,\n",
    "                                                        })\n",
    "#         df_1 = df.drop_duplicates(['user','day','actionType'],keep='last')\n",
    "        df_1 = df_1.drop_duplicates(['userid','day','actionType'],keep='last')\n",
    "#         df_1 = pd.merge(df_1,df,on=['user','day','actionType'],how='left')\n",
    "        actions_2  =  df_1[['userid','actionTime']].groupby(['userid'],as_index=False)['actionTime'].agg({\n",
    "                                                                'get_feat_007_first_last_not_reap':last_sub_fisrt,\n",
    "                                                                'get_feat_007_nums_not_reap':get_nums,\n",
    "                                                                'get_feat_007_diff_mean_not_reap':diff_mean,\n",
    "                                                                'get_feat_007_diff_std_not_reap':diff_std,\n",
    "                                                        })\n",
    "        df  =  pd.merge(actions_1,actions_2,on='userid',how='left')\n",
    "        df['rate_get_feat_007_first_last'] = df['get_feat_007_first_last_not_reap']/df['get_feat_007_first_last']\n",
    "        df['rate_get_feat_007_nums'] = df['get_feat_007_nums_not_reap']/df['get_feat_007_nums']\n",
    "        df['rate_get_get_feat_007_diff_mean'] = df['get_feat_007_diff_mean_not_reap']/df['get_feat_007_diff_mean']\n",
    "        df['rate_get_feat_007_diff_std'] = df['get_feat_007_diff_std_not_reap']/df['get_feat_007_diff_std']\n",
    "        df.to_csv(dump_path,index=False)\n",
    "        return df\n",
    "def get_feat_008(train):\n",
    "    dump_path='../cache/get_feat_008_%s——2.csv'%train\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "            \n",
    "        df['date'] = df['actionTime'].map(lambda x:datetime.datetime.utcfromtimestamp(x).strftime('%Y-%m-%d'))\n",
    "        df['time'] = df['actionTime'].map( lambda x: datetime.datetime.utcfromtimestamp(x))\n",
    "        df['day'] = df['time'].map( lambda x: x.isocalendar()[1]*7+x.isocalendar()[2])\n",
    "        df['day'] = df['day']+ (df['time'].dt.year-2016)*356\n",
    "        \n",
    "        df = df.drop_duplicates(['userid','day','actionType'],keep='last')\n",
    "        \n",
    "        actions_1 = pd.get_dummies(df['actionType'],prefix='get_feat_007_type')\n",
    "        actions = pd.concat([df[['userid']],actions_1],axis=1)\n",
    "        actions = actions.groupby(['userid'],as_index=False).sum()\n",
    "        actions['get_feat_007_type']=0\n",
    "        for i in range(1,10,1):\n",
    "            actions['get_feat_007_type']=actions['get_feat_007_type']+actions['get_feat_007_type_'+str(i)]\n",
    "        for i in range(1,10,1):\n",
    "            actions['get_feat_007_type_rate_'+str(i)]=actions['get_feat_007_type_'+str(i)]/actions['get_feat_007_type']\n",
    "            del actions['get_feat_007_type_'+str(i)]\n",
    "        actions.to_csv(dump_path,index=False)\n",
    "        return actions\n",
    "def get_feat_009(train):\n",
    "    dump_path='../cache/get_feat_009_%s.csv'%(train)\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "        df_order = get_orderHistory(train)\n",
    "#         df_order = \n",
    "        df_order_1 = df_order[['userid','orderTime']]\n",
    "        df_order_1.columns =['userid','orderTime_end']\n",
    "#         df_order = df_order[df_order['orderType']==0]\n",
    "        df_order_1 = df_order_1.drop_duplicates(['userid'],keep='last')\n",
    "    \n",
    "#         df_order = df_order[df_order['orderTime']<df_order['orderTime_end']]\n",
    "#         df_order = df_order[['userid','orderTime','orderTime_end']].drop_duplicates(['userid'],keep='last')\n",
    "#         print(df_order)\n",
    "        \n",
    "        df = pd.merge(df,df_order_1,on='userid',how='left')\n",
    "        df['orderTime_end'] = df['orderTime_end'].fillna(0)\n",
    "\n",
    "        df = df[(df['actionTime']>df['orderTime_end'])]\n",
    "        \n",
    "#         actions_1 = pd.get_dummies(df['actionType'],prefix='actions_16_type')\n",
    "# #         print(actions_1)\n",
    "#         actions = pd.concat([df[['userid']],actions_1],axis=1)\n",
    "#         actions = actions.groupby(['userid'],as_index=False).sum()\n",
    "#         actions['actions_16_type']=0\n",
    "#         for i in range(1,10,1):\n",
    "#             actions['actions_16_type']=actions['actions_16_type']+actions['actions_16_type_'+str(i)]\n",
    "#         for i in range(1,10,1):\n",
    "#             actions['actions_16_type_rate_'+str(i)]=actions['actions_16_type_'+str(i)]/actions['actions_16_type']\n",
    "#             del actions['actions_16_type_'+str(i)]\n",
    "        actions = df[['userid','actionTime']].groupby(['userid'])['actionTime'].agg({\n",
    "                                                                      'get_feat_009_mean':diff_mean,\n",
    "                                                                      'get_feat_009_std':diff_std,\n",
    "                                                                      'get_feat_009_max':diff_max,\n",
    "                                                                      'get_feat_009_min':diff_min,\n",
    "                                        \n",
    "#                                                                       'feat_3_last_2':diff_last_2,\n",
    "#                                                                       'feat_3_last_3':diff_last_3\n",
    "                                                                    })\n",
    "        actions = actions.reset_index()\n",
    "#         actions.to_csv(dump_path,index=False)\n",
    "        return actions\n",
    "\n",
    "def get_feat_010(train):\n",
    "    dump_path='../cache/get_feat_010_%s_1.csv'%(train)\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        df_prof = get_userProfile(train)\n",
    "        df_order = get_orderHistory(train)\n",
    "        \n",
    "        df =pd.merge(df_order,df_prof,on='userid',how='left')\n",
    "        actions = df[['userid','province']].drop_duplicates(['userid'],keep='last')\n",
    "        # df['date'] = df['orderTime'].map(lambda x:datetime.datetime.utcfromtimestamp(x).strftime('%Y-%m-%d'))\n",
    "#         df_1 = df[df['orderType']==1]\n",
    "        \n",
    "        actions_0 = df[['province','orderType']].groupby('province',as_index=False).count()\n",
    "        actions_0.columns = ['province','orderType_0_nums']\n",
    "        \n",
    "        actions_1 = df[['province','orderType']].groupby('province',as_index=False).sum()\n",
    "        actions_1.columns = ['province','orderType_1_nums']\n",
    "        \n",
    "        actions = pd.merge(actions,actions_0,on='province',how='left')\n",
    "        \n",
    "        actions = pd.merge(actions,actions_1,on='province',how='left')\n",
    "        \n",
    "        actions['rate_orderType'] = actions['orderType_1_nums']/ actions['orderType_0_nums']\n",
    "        del actions['province']\n",
    "        actions.to_csv(dump_path,index=False)\n",
    "        return actions\n",
    "def get_feat_011(train):\n",
    "    dump_path='../cache/get_feat_11_%s.csv'%(train)\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "        df = pd.merge(df,df,on='userid',how='left')\n",
    "        df = df[df['actionTime_x']>df['actionTime_y']]\n",
    "        df['diff_time'] =df['actionTime_x'] - df['actionTime_y']\n",
    "        df = df.sort_values(by='diff_time',ascending=1)\n",
    "        df =df[['userid','diff_time']].groupby(['userid'])['diff_time'].agg({\n",
    "                                    'get_feat_011_first_1_time':first_1,\n",
    "                        'get_feat_011_first_2_time':first_2,\n",
    "                        'get_feat_011_first_3_time':first_3\n",
    "        })\n",
    "        df = df.reset_index()\n",
    "        df.to_csv(dump_path,index=False)\n",
    "        return df\n",
    "\n",
    "\n",
    "def get_feat_011_1(train):\n",
    "    dump_path='../cache/get_feat_011_zl11_%s_1.csv'%(train)\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "        \n",
    "        df = pd.merge(df,df,on='userid',how='left')\n",
    "        df = df[df['actionTime_x']>df['actionTime_y']]\n",
    "        df['diff_time'] =df['actionTime_x'] - df['actionTime_y']\n",
    "        df = df.sort_values(by='diff_time',ascending=1)\n",
    "        df =df[['userid','actionType_x','actionType_y']].groupby(['userid'],as_index=False)['actionType_x','actionType_y'].agg({\n",
    "                                'get_feat_011_1_first_type':first_1,\n",
    "                    'get_feat_011_1_first_2_type':first_2,\n",
    "                    'get_feat_011_1_first_3_type':first_3\n",
    "        })\n",
    "        \n",
    "        df_1 = df['userid']\n",
    "        \n",
    "        df_2 = pd.DataFrame({'get_feat_011_1_first_type_1':df['get_feat_011_1_first_type'].actionType_x,'get_feat_011_1_first_type_2':df['get_feat_011_1_first_type'].actionType_y})\n",
    "        df_3 = pd.DataFrame({'get_feat_011_2_first_type_1':df['get_feat_011_1_first_2_type'].actionType_x,'get_feat_011_2_first_type_2':df['get_feat_011_1_first_2_type'].actionType_y})\n",
    "\n",
    "        df_4 = pd.DataFrame({'get_feat_011_3_first_type_1':df['get_feat_011_1_first_3_type'].actionType_x,'get_feat_011_3_first_type_2':df['get_feat_011_1_first_3_type'].actionType_y})\n",
    "        df = pd.concat([df_1,df_2,df_3,df_4],axis=1)\n",
    "        df.to_csv(dump_path,index=False)\n",
    "        return df\n",
    "def get_feat_012(train,type_s,type_e):\n",
    "    dump_path='../cache/get_feat_12_%s_%s_%s_2.csv'%(train,str(type_s),str(type_e))\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "        df_1 = df[df['actionType']==type_s]\n",
    "        df_2 = df[df['actionType']==type_e]\n",
    "        df = pd.merge(df_1,df_2,on='userid',how='left')\n",
    "        df = df[df['actionTime_x']<df['actionTime_y']]\n",
    "        df['diff_time_'+str(type_s)+\"_\"+str(type_e)] =df['actionTime_y'] - df['actionTime_x']\n",
    "        df = df.sort_values(by='diff_time_'+str(type_s)+\"_\"+str(type_e),ascending=1)\n",
    "        df =df[['userid','diff_time_'+str(type_s)+\"_\"+str(type_e)]].groupby(['userid'])['diff_time_'+str(type_s)+\"_\"+str(type_e)].agg({\n",
    "                                    'get_feat_011_first_1_time'+'diff_time_'+str(type_s)+\"_\"+str(type_e):first_1,\n",
    "                        'get_feat_011_first_2_time'+'diff_time_'+str(type_s)+\"_\"+str(type_e):first_2,\n",
    "                        'get_feat_011_first_3_time'+'diff_time_'+str(type_s)+\"_\"+str(type_e):first_3\n",
    "        })\n",
    "        df = df.reset_index()\n",
    "        df.to_csv(dump_path,index=False)\n",
    "        return df\n",
    "\n",
    "\n",
    "def get_feat_013(train,type_s,type_e):\n",
    "    dump_path='../cache/get_feat_13_%s_%s_%s_2.csv'%(train,str(type_s),str(type_e))\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "        \n",
    "        df_1 = df[df['actionType']==type_s]\n",
    "        df_2 = df[df['actionType']==type_e]\n",
    "        df = pd.merge(df_1,df_2,on='userid',how='left')\n",
    "        \n",
    "        df = df[df['actionTime_x']<df['actionTime_y']]\n",
    "       \n",
    "        df['diff_time_'+str(type_s)+\"_\"+str(type_e)] =df['actionTime_y'] - df['actionTime_x']\n",
    "        df = df.sort_values(by=['userid','actionTime_x','actionTime_y'],ascending=[1,1,1]) \n",
    "        df = df.drop_duplicates(['userid','actionTime_x'],keep='first')\n",
    "        df =df[['userid','diff_time_'+str(type_s)+\"_\"+str(type_e)]].groupby(['userid'])['diff_time_'+str(type_s)+\"_\"+str(type_e)].agg({\n",
    "                                    'get_feat_013_first_1_time'+'diff_time_'+str(type_s)+\"_\"+str(type_e):first_1,\n",
    "                        'get_feat_013_first_2_time'+'diff_time_'+str(type_s)+\"_\"+str(type_e):first_2,\n",
    "                        'get_feat_013_first_3_time'+'diff_time_'+str(type_s)+\"_\"+str(type_e):first_3,\n",
    "                        'get_feat_013_last_1_time'+'diff_time_'+str(type_s)+\"_\"+str(type_e):last_1,\n",
    "                        'get_feat_013_last_2_time'+'diff_time_'+str(type_s)+\"_\"+str(type_e):last_2,\n",
    "                        'get_feat_013_last_3_time'+'diff_time_'+str(type_s)+\"_\"+str(type_e):last_3,\n",
    "        })\n",
    "        df = df.reset_index()\n",
    "        df.to_csv(dump_path,index=False)\n",
    "        return df\n",
    "    \n",
    "def get_feat_013_1(train,type_s,type_e):\n",
    "    dump_path='../cache/get_feat_13_1_%s_%s_%s_3.csv'%(train,str(type_s),str(type_e))\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "        actions = df \n",
    "        df_1 = df[df['actionType']==type_s]\n",
    "        df_2 = df[df['actionType']==type_e]\n",
    "        df = pd.merge(df_1,df_2,on='userid',how='left')\n",
    "        \n",
    "        df = df[df['actionTime_x']<df['actionTime_y']]\n",
    "        \n",
    "        \n",
    "#         df['diff_time_'+str(type_s)+\"_\"+str(type_e)] =df['actionTime_y'] - df['actionTime_x']\n",
    "        df = df.sort_values(by=['userid','actionTime_x','actionTime_y'],ascending=[1,1,1]) \n",
    "        df = df.drop_duplicates(['userid','actionTime_x'],keep='first')\n",
    "#         print(df.shape)\n",
    "        df = pd.merge(df,actions,on='userid',how='left')\n",
    "#         print(df.shape)\n",
    "        df = df[(df['actionTime_x']<df['actionTime']) &(df['actionTime_y']>df['actionTime'])]\n",
    "        \n",
    "        df = df.sort_values(by=['userid','actionTime_x'],ascending=[1,1]) \n",
    "        \n",
    "        df = df[['userid','actionTime','actionTime_x']].groupby(['userid','actionTime_x'],as_index=False).count()\n",
    "#         print(df.head())\n",
    "        \n",
    "        df =df[['userid','actionTime']].groupby(['userid'])['actionTime'].agg({\n",
    "                        'get_feat_013_1_first_1_time'+str(type_s)+\"_\"+str(type_e):first_1,\n",
    "                        'get_feat_013_1_first_2_time'+str(type_s)+\"_\"+str(type_e):first_2,\n",
    "                        'get_feat_013_1_first_3_time'+str(type_s)+\"_\"+str(type_e):first_3,\n",
    "                        'get_feat_013_1_last_1_time'+str(type_s)+\"_\"+str(type_e):last_1,\n",
    "                        'get_feat_013_1_last_2_time'+str(type_s)+\"_\"+str(type_e):last_2,\n",
    "                        'get_feat_013_1_last_3_time'+str(type_s)+\"_\"+str(type_e):last_3,\n",
    "        })\n",
    "        df = df.reset_index()\n",
    "        df.to_csv(dump_path,index=False)\n",
    "        return df\n",
    "def get_feat_013_2(train,type_s,type_e):\n",
    "    dump_path='../cache/get_feat_13_2_%s_%s_%s_3.csv'%(train,str(type_s),str(type_e))\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "        actions = df \n",
    "        df_1 = df[df['actionType']==type_s]\n",
    "        df_2 = df[df['actionType']==type_e]\n",
    "        df = pd.merge(df_1,df_2,on='userid',how='left')\n",
    "        \n",
    "        df = df[df['actionTime_x']<df['actionTime_y']]\n",
    "        \n",
    "        \n",
    "#         df['diff_time_'+str(type_s)+\"_\"+str(type_e)] =df['actionTime_y'] - df['actionTime_x']\n",
    "        df = df.sort_values(by=['userid','actionTime_x','actionTime_y'],ascending=[1,1,1]) \n",
    "        df = df.drop_duplicates(['userid','actionTime_x'],keep='first')\n",
    "#         print(df.shape)\n",
    "        df = pd.merge(df,actions,on='userid',how='left')\n",
    "#         print(df.shape)\n",
    "        df = df[(df['actionTime_x']<=df['actionTime']) &(df['actionTime_y']>df['actionTime'])]\n",
    "        \n",
    "        df = df.sort_values(by=['userid','actionTime_x'],ascending=[1,1]) \n",
    "        \n",
    "        df = df[['userid','actionTime','actionTime_x']].groupby(['userid','actionTime_x'],as_index=False).count()\n",
    "#         print(df.head())\n",
    "        \n",
    "        df =df[['userid','actionTime']].groupby(['userid'])['actionTime'].agg({\n",
    "                        'get_feat_013_2_first_1_time'+str(type_s)+\"_\"+str(type_e):first_1,\n",
    "                        'get_feat_013_2_first_2_time'+str(type_s)+\"_\"+str(type_e):first_2,\n",
    "                        'get_feat_013_2_first_3_time'+str(type_s)+\"_\"+str(type_e):first_3,\n",
    "                        'get_feat_013_2_last_1_time'+str(type_s)+\"_\"+str(type_e):last_1,\n",
    "                        'get_feat_013_2_last_2_time'+str(type_s)+\"_\"+str(type_e):last_2,\n",
    "                        'get_feat_013_2_last_3_time'+str(type_s)+\"_\"+str(type_e):last_3,\n",
    "        })\n",
    "        df = df.reset_index()\n",
    "        df.to_csv(dump_path,index=False)\n",
    "        return df\n",
    "def get_feat_015(train,type_s):\n",
    "    dump_path='../cache/get_feat_15_%s_%s_5.csv'%(train,str(type_s))\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "        \n",
    "        df_1 = df[df['actionType']==type_s]\n",
    "#         df_2 = df[df['actionType']==type_e]\n",
    "        \n",
    "        \n",
    "        df = df[df.actionType!=type_s]\n",
    "        \n",
    "        df = pd.merge(df_1,df,on='userid',how='left')\n",
    "        \n",
    "        df = df[df['actionTime_x']<df['actionTime_y']]\n",
    "\n",
    "#         df['diff_time_'+str(type_s)+\"_\"+str(type_e)] =df['actionTime_y'] - df['actionTime_x']\n",
    "        df = df.sort_values(by=['userid','actionTime_x','actionTime_y'],ascending=[1,1,1]) \n",
    "#         df = df.drop_duplicates(['userid','actionTime_y'],keep='first')\n",
    "        df = df.drop_duplicates(['userid','actionTime_x'],keep='first')\n",
    "#         df = df.sort_values(by='diff_time_'+str(type_s)+\"_\"+str(type_e),ascending=0)\n",
    "        df =df[['userid','actionType_y']].groupby(['userid'])['actionType_y'].agg({\n",
    "                         'get_feat_015_first_1_time'+'diff_time_'+str(type_s):first_1,\n",
    "                        'get_feat_015_first_2_time'+'diff_time_'+str(type_s):first_2,\n",
    "                        'get_feat_015_first_3_time'+'diff_time_'+str(type_s):first_3,\n",
    "                        'get_feat_015_last_1_time'+'diff_time_'+str(type_s):last_1,\n",
    "                        'get_feat_015_last_2_time'+'diff_time_'+str(type_s):last_2,\n",
    "                        'get_feat_015_last_3_time'+'diff_time_'+str(type_s):last_3,\n",
    "                        \n",
    "        })\n",
    "        df = df.reset_index()\n",
    "        df.to_csv(dump_path,index=False)\n",
    "        return df        \n",
    "    \n",
    "def different_count(x):\n",
    "#     print(x)\n",
    "    y=[]\n",
    "    for i in range(1,x.shape[0]):\n",
    "        if(x.iloc[i]!=x.iloc[i-1]):\n",
    "            y.append(x.iloc[i-1])\n",
    "    if(x.iloc[x.shape[0]-1]!=x.iloc[x.shape[0]-2]):\n",
    "        y.append(x.iloc[len(x)-1])\n",
    "    y = np.asarray(y)\n",
    "    return y[0:1].mean(),y[1:2].mean(),y[2:3].mean(),y[-3:-2].mean(),y[-2:-1].mean(),y[-1:].mean()\n",
    "\n",
    "\n",
    "    \n",
    "def get_feat_014(train):\n",
    "    dump_path='../cache/get_feat_14_%s.csv'%(train)\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "        \n",
    "        df = df.groupby(['userid'],as_index=False)['actionType'].agg({\n",
    "            'get_feat_014':different_count,\n",
    "        })\n",
    "#         print(df.head())\n",
    "        df_2 = df[['userid']]\n",
    "        df_1 = pd.DataFrame(list(df['get_feat_014']),columns=['get_feat_014_first_1','get_feat_014_first_2','get_feat_014_first_3','get_feat_014_last_3','get_feat_014_last_2','get_feat_014_last_1'])\n",
    "#         print(df_1.head())\n",
    "#         df_1 = df_1.astype('Int32')\n",
    "#         print(df_1.head())\n",
    "        df = pd.concat([df_2,df_1],axis=1)\n",
    "        print(df.head())\n",
    "        \n",
    "        df.to_csv(dump_path,index=False)\n",
    "\n",
    "        return df\n",
    "    \n",
    "def get_feat_016(train):\n",
    "    dump_path='../cache/get_feat_016_%s.csv'%(train)\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "        df_1 = df.drop_duplicates(['userid'],keep='last')[['userid','actionTime']]\n",
    "        df_1.columns = ['userid','start_time']\n",
    "        df = pd.merge(df,df_1,on='userid',how='left')\n",
    "        df['start_time'] = df['start_time'] -3600*24*30\n",
    "        df = df[df['actionTime']>df['start_time']]\n",
    "        actions = df[['userid','actionTime']].groupby(['userid'])['actionTime'].agg({\n",
    "                                                                      'feat_16_mean':diff_mean,\n",
    "                                                                      'feat_3_std':diff_std,\n",
    "#                                                                       'feat_3_max':diff_max,\n",
    "                                                                      'feat_16_min':diff_min,\n",
    "                                                                      'feat_16_last_1':diff_last_1,\n",
    "                                                                      'feat_16_last_2':diff_last_2,\n",
    "                                                                      'feat_16_last_3':diff_last_3,\n",
    "            \n",
    "                                                                      'feat_16_first_1': diff_first_1,\n",
    "                                                                      'feat_16_first_2': diff_first_2,\n",
    "                                                                      'feat_16_first_3': diff_first_3,\n",
    "            \n",
    "                                                                     \n",
    "                                                                    })\n",
    "        actions = actions.reset_index()\n",
    "        actions.to_csv(dump_path,index=False)\n",
    "\n",
    "        return actions\n",
    "        \n",
    "print(\"finish\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "finish\n"
     ]
    }
   ],
   "source": [
    "def get_feat(train):\n",
    "    df = get_feat_1(train)  #1\n",
    "    \n",
    "#     df = pd.merge(df,get_feat_1_1(train),on='userid',how='outer')\n",
    "    \n",
    "    df = pd.merge(df,get_feat_2(train),on='userid',how='outer')\n",
    "    df = pd.merge(df,get_feat_3(train),on='userid',how='outer') #修改\n",
    "#     print(df.shape)\n",
    "    df = pd.merge(df,get_feat_4(train),on='userid',how='outer')#部分有用\n",
    "#     print(df.shape)\n",
    "    \n",
    "   \n",
    "    df = pd.merge(df,get_feat_6(train),on='userid',how='outer') #部分有用\n",
    "    df = pd.merge(df,get_feat_7(train),on='userid',how='outer')#1\n",
    "    \n",
    "   \n",
    "   \n",
    "    df = pd.merge(df,get_feat_20(train),on='userid',how='outer')\n",
    "\n",
    "    df = pd.merge(df,get_feat_22(train),on='userid',how='outer')\n",
    "    df = pd.merge(df,get_feat_22_1567(train),on='userid',how='outer')\n",
    "    df = pd.merge(df,get_feat_26(train),on='userid',how='outer')\n",
    "    df = pd.merge(df,get_feat_27(train),on='userid',how='outer')   #0.1%\n",
    "    df = pd.merge(df,get_feat_28(train),on='userid',how='outer')\n",
    "\n",
    "    df = pd.merge(df,get_feat_30(train),on='userid',how='outer')\n",
    "    df = pd.merge(df,get_feat_001(train),on='userid',how='outer')  \n",
    "\n",
    "    \n",
    "    df = pd.merge(df,get_feat_011(train),on='userid',how='outer')\n",
    "\n",
    "    \n",
    "#     df = pd.merge(df,get_feat_012(train,2,2),on='userid',how='outer')#15562\n",
    "#     df = pd.merge(df,get_feat_012(train,1,3),on='userid',how='outer')#11900\n",
    "#     df = pd.merge(df,get_feat_012(train,1,4),on='userid',how='outer')#8591\n",
    "    \n",
    "    \n",
    "    \n",
    "    df = pd.merge(df,get_feat_012(train,5,6),on='userid',how='outer') #35984\n",
    "    df = pd.merge(df,get_feat_012(train,6,7),on='userid',how='outer')#15354\n",
    "    df = pd.merge(df,get_feat_012(train,7,8),on='userid',how='outer')#4649\n",
    "    df = pd.merge(df,get_feat_012(train,8,9),on='userid',how='outer')#8544\n",
    "    df = pd.merge(df,get_feat_012(train,5,7),on='userid',how='outer')#15562\n",
    "    df = pd.merge(df,get_feat_012(train,5,8),on='userid',how='outer')#11900\n",
    "    df = pd.merge(df,get_feat_012(train,5,9),on='userid',how='outer')#8591\n",
    "    \n",
    "#     df =  pd.merge(df,get_feat_012(train,5,5),on='userid',how='outer') #35260\n",
    "#     df =  pd.merge(df,get_feat_012(train,6,6),on='userid',how='outer') #29359\n",
    "\n",
    "#     df = pd.merge(df,get_feat_012(train,1,5),on='userid',how='outer')#36132\n",
    "#     df = pd.merge(df,get_feat_012(train,1,6),on='userid',how='outer')#34371\n",
    "#     df = pd.merge(df,get_feat_012(train,1,7),on='userid',how='outer')#15053\n",
    "#     df = pd.merge(df,get_feat_012(train,1,8),on='userid',how='outer')#11163\n",
    "#     df = pd.merge(df,get_feat_012(train,1,9),on='userid',how='outer')#8437\n",
    "    \n",
    "\n",
    "#     df = pd.merge(df,get_feat_012(train,5,1),on='userid',how='outer')#30482\n",
    "#     df = pd.merge(df,get_feat_012(train,6,1),on='userid',how='outer')#25178\n",
    "#     df = pd.merge(df,get_feat_012(train,7,1),on='userid',how='outer')#6995\n",
    "#     df = pd.merge(df,get_feat_012(train,8,1),on='userid',how='outer')#11356\n",
    "#     df = pd.merge(df,get_feat_012(train,9,1),on='userid',how='outer')#8773\n",
    "    \n",
    "#     df = pd.merge(df,get_feat_013(train,1,2),on='userid',how='outer')#15562\n",
    "#     df = pd.merge(df,get_feat_013(train,1,3),on='userid',how='outer')#11900\n",
    "#     df = pd.merge(df,get_feat_013(train,1,4),on='userid',how='outer')#8591\n",
    "    \n",
    "    \n",
    "    df = pd.merge(df,get_feat_013(train,5,6),on='userid',how='outer') #35984\n",
    "    df = pd.merge(df,get_feat_013(train,6,7),on='userid',how='outer')#15354\n",
    "    df = pd.merge(df,get_feat_013(train,7,8),on='userid',how='outer')#4649\n",
    "    df = pd.merge(df,get_feat_013(train,8,9),on='userid',how='outer')#8544\n",
    "    df = pd.merge(df,get_feat_013(train,5,7),on='userid',how='outer')#15562\n",
    "    df = pd.merge(df,get_feat_013(train,5,8),on='userid',how='outer')#11900\n",
    "    df = pd.merge(df,get_feat_013(train,5,9),on='userid',how='outer')#8591\n",
    "    \n",
    "#     df = pd.merge(df,get_feat_013(train,1,5),on='userid',how='outer')#36132\n",
    "#     df = pd.merge(df,get_feat_013(train,1,6),on='userid',how='outer')#34371\n",
    "#     df = pd.merge(df,get_feat_013(train,1,7),on='userid',how='outer')#15053\n",
    "#     df = pd.merge(df,get_feat_013(train,1,8),on='userid',how='outer')#11163\n",
    "#     df = pd.merge(df,get_feat_013(train,1,9),on='userid',how='outer')#8437\n",
    "    \n",
    "\n",
    "#     df = pd.merge(df,get_feat_013(train,5,1),on='userid',how='outer')#30482\n",
    "#     df = pd.merge(df,get_feat_013(train,6,1),on='userid',how='outer')#25178\n",
    "#     df = pd.merge(df,get_feat_013(train,7,1),on='userid',how='outer')#6995\n",
    "#     df = pd.merge(df,get_feat_013(train,8,1),on='userid',how='outer')#11356\n",
    "#     df = pd.merge(df,get_feat_013(train,9,1),on='userid',how='outer')#8773\n",
    "\n",
    "\n",
    "\n",
    "    df = pd.merge(df,get_feat_013_2(train,5,5),on='userid',how='outer') #35984\n",
    "    df = pd.merge(df,get_feat_013_2(train,6,6),on='userid',how='outer')#15354\n",
    "    df = pd.merge(df,get_feat_013_2(train,7,7),on='userid',how='outer')#4649\n",
    "    df = pd.merge(df,get_feat_013_2(train,8,8),on='userid',how='outer')#8544\n",
    "    df = pd.merge(df,get_feat_013_2(train,9,9),on='userid',how='outer')#15562\n",
    "    df = pd.merge(df,get_feat_013_2(train,1,1),on='userid',how='outer')#11900\n",
    "#     df = pd.merge(df,get_feat_013_2(train,5,9),on='userid',how='outer')#8591\n",
    "\n",
    "\n",
    "#     df = pd.merge(df,get_feat_016(train),on='userid',how='outer')\n",
    "       \n",
    "\n",
    "    \n",
    " \n",
    "    \n",
    "    \n",
    "    df = pd.merge(df,get_userprofile_map(train),on='userid',how='outer')\n",
    "    return df\n",
    "def get_train_df():\n",
    "    df = pd.read_csv('../data/train/orderFuture_train.csv')\n",
    "    print(df.shape)\n",
    "    df = pd.merge(df,get_feat('train'),on='userid',how='left')\n",
    "    print(df.shape)\n",
    "    return df\n",
    "def get_test_df():\n",
    "    df = pd.read_csv('../data/test/orderFuture_test.csv')\n",
    "    print(df.shape)\n",
    "    df = pd.merge(df,get_feat('test'),on='userid',how='left')\n",
    "    print(df.shape)\n",
    "    \n",
    "    return df\n",
    "print(\"finish\")   "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(40307, 2)\n",
      "(40307, 249)\n",
      "(10076, 2)\n",
      "(10076, 249)\n"
     ]
    }
   ],
   "source": [
    "train = get_train_df()\n",
    "test = get_test_df()\n",
    "# train = drop_nan(train)\n",
    "# test = test[train.columns]\n",
    "# print(train.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0]\ttrain-auc:0.777225\teval-auc:0.771994\n",
      "Multiple eval metrics have been passed: 'eval-auc' will be used for early stopping.\n",
      "\n",
      "Will train until eval-auc hasn't improved in 20 rounds.\n",
      "[1]\ttrain-auc:0.841569\teval-auc:0.829786\n",
      "[2]\ttrain-auc:0.846237\teval-auc:0.834591\n",
      "[3]\ttrain-auc:0.879135\teval-auc:0.866335\n",
      "[4]\ttrain-auc:0.881019\teval-auc:0.866967\n",
      "[5]\ttrain-auc:0.881779\teval-auc:0.86624\n",
      "[6]\ttrain-auc:0.880958\teval-auc:0.865481\n",
      "[7]\ttrain-auc:0.882322\teval-auc:0.86661\n",
      "[8]\ttrain-auc:0.881945\teval-auc:0.866353\n",
      "[9]\ttrain-auc:0.882292\teval-auc:0.866557\n",
      "[10]\ttrain-auc:0.882333\teval-auc:0.866757\n",
      "[11]\ttrain-auc:0.88355\teval-auc:0.867728\n",
      "[12]\ttrain-auc:0.883904\teval-auc:0.868348\n",
      "[13]\ttrain-auc:0.886538\teval-auc:0.871629\n",
      "[14]\ttrain-auc:0.886418\teval-auc:0.871445\n",
      "[15]\ttrain-auc:0.887179\teval-auc:0.87193\n",
      "[16]\ttrain-auc:0.886842\teval-auc:0.871829\n",
      "[17]\ttrain-auc:0.897449\teval-auc:0.881647\n",
      "[18]\ttrain-auc:0.897502\teval-auc:0.881527\n",
      "[19]\ttrain-auc:0.897763\teval-auc:0.881745\n",
      "[20]\ttrain-auc:0.89954\teval-auc:0.8837\n",
      "[21]\ttrain-auc:0.899739\teval-auc:0.883712\n",
      "[22]\ttrain-auc:0.90177\teval-auc:0.886546\n",
      "[23]\ttrain-auc:0.902983\teval-auc:0.888146\n",
      "[24]\ttrain-auc:0.903964\teval-auc:0.889272\n",
      "[25]\ttrain-auc:0.904736\teval-auc:0.890146\n",
      "[26]\ttrain-auc:0.906088\teval-auc:0.891275\n",
      "[27]\ttrain-auc:0.906759\teval-auc:0.892182\n",
      "[28]\ttrain-auc:0.908057\teval-auc:0.893407\n",
      "[29]\ttrain-auc:0.911939\teval-auc:0.897163\n",
      "[30]\ttrain-auc:0.913078\teval-auc:0.899198\n",
      "[31]\ttrain-auc:0.913287\teval-auc:0.89951\n",
      "[32]\ttrain-auc:0.91705\teval-auc:0.903642\n",
      "[33]\ttrain-auc:0.920302\teval-auc:0.905962\n",
      "[34]\ttrain-auc:0.922212\teval-auc:0.908322\n",
      "[35]\ttrain-auc:0.925499\teval-auc:0.911202\n",
      "[36]\ttrain-auc:0.927519\teval-auc:0.913086\n",
      "[37]\ttrain-auc:0.928071\teval-auc:0.913617\n",
      "[38]\ttrain-auc:0.929881\teval-auc:0.91585\n",
      "[39]\ttrain-auc:0.930906\teval-auc:0.916877\n",
      "[40]\ttrain-auc:0.931805\teval-auc:0.917996\n",
      "[41]\ttrain-auc:0.93346\teval-auc:0.919642\n",
      "[42]\ttrain-auc:0.934366\teval-auc:0.920482\n",
      "[43]\ttrain-auc:0.935417\teval-auc:0.92129\n",
      "[44]\ttrain-auc:0.936431\teval-auc:0.922358\n",
      "[45]\ttrain-auc:0.938582\teval-auc:0.925273\n",
      "[46]\ttrain-auc:0.939622\teval-auc:0.926319\n",
      "[47]\ttrain-auc:0.940679\teval-auc:0.927847\n",
      "[48]\ttrain-auc:0.941047\teval-auc:0.928424\n",
      "[49]\ttrain-auc:0.941631\teval-auc:0.9293\n",
      "[50]\ttrain-auc:0.943006\teval-auc:0.93104\n",
      "[51]\ttrain-auc:0.944132\teval-auc:0.932361\n",
      "[52]\ttrain-auc:0.944198\teval-auc:0.932524\n",
      "[53]\ttrain-auc:0.944842\teval-auc:0.933344\n",
      "[54]\ttrain-auc:0.94563\teval-auc:0.934205\n",
      "[55]\ttrain-auc:0.94547\teval-auc:0.934032\n",
      "[56]\ttrain-auc:0.946243\teval-auc:0.934426\n",
      "[57]\ttrain-auc:0.946938\teval-auc:0.935172\n",
      "[58]\ttrain-auc:0.947468\teval-auc:0.935829\n",
      "[59]\ttrain-auc:0.948577\teval-auc:0.937197\n",
      "[60]\ttrain-auc:0.948886\teval-auc:0.937676\n",
      "[61]\ttrain-auc:0.949784\teval-auc:0.938752\n",
      "[62]\ttrain-auc:0.95005\teval-auc:0.939082\n",
      "[63]\ttrain-auc:0.950433\teval-auc:0.939704\n",
      "[64]\ttrain-auc:0.950824\teval-auc:0.940289\n",
      "[65]\ttrain-auc:0.951188\teval-auc:0.94074\n",
      "[66]\ttrain-auc:0.951795\teval-auc:0.941454\n",
      "[67]\ttrain-auc:0.95217\teval-auc:0.941671\n",
      "[68]\ttrain-auc:0.952491\teval-auc:0.941949\n",
      "[69]\ttrain-auc:0.952617\teval-auc:0.942207\n",
      "[70]\ttrain-auc:0.953483\teval-auc:0.943275\n",
      "[71]\ttrain-auc:0.953904\teval-auc:0.943776\n",
      "[72]\ttrain-auc:0.954281\teval-auc:0.944101\n",
      "[73]\ttrain-auc:0.954581\teval-auc:0.944394\n",
      "[74]\ttrain-auc:0.95492\teval-auc:0.944645\n",
      "[75]\ttrain-auc:0.955053\teval-auc:0.944671\n",
      "[76]\ttrain-auc:0.955252\teval-auc:0.944867\n",
      "[77]\ttrain-auc:0.955381\teval-auc:0.94495\n",
      "[78]\ttrain-auc:0.955854\teval-auc:0.945631\n",
      "[79]\ttrain-auc:0.95622\teval-auc:0.94604\n",
      "[80]\ttrain-auc:0.956247\teval-auc:0.946192\n",
      "[81]\ttrain-auc:0.95668\teval-auc:0.946864\n",
      "[82]\ttrain-auc:0.956825\teval-auc:0.946916\n",
      "[83]\ttrain-auc:0.957188\teval-auc:0.947197\n",
      "[84]\ttrain-auc:0.957513\teval-auc:0.947569\n",
      "[85]\ttrain-auc:0.957753\teval-auc:0.947845\n",
      "[86]\ttrain-auc:0.957909\teval-auc:0.947926\n",
      "[87]\ttrain-auc:0.95816\teval-auc:0.948154\n",
      "[88]\ttrain-auc:0.958607\teval-auc:0.9486\n",
      "[89]\ttrain-auc:0.958705\teval-auc:0.94874\n",
      "[90]\ttrain-auc:0.958888\teval-auc:0.948876\n",
      "[91]\ttrain-auc:0.958996\teval-auc:0.949007\n",
      "[92]\ttrain-auc:0.959151\teval-auc:0.949197\n",
      "[93]\ttrain-auc:0.959356\teval-auc:0.949413\n",
      "[94]\ttrain-auc:0.959532\teval-auc:0.949626\n",
      "[95]\ttrain-auc:0.959823\teval-auc:0.949964\n",
      "[96]\ttrain-auc:0.960093\teval-auc:0.950233\n",
      "[97]\ttrain-auc:0.960228\teval-auc:0.950374\n",
      "[98]\ttrain-auc:0.960374\teval-auc:0.95052\n",
      "[99]\ttrain-auc:0.960682\teval-auc:0.950775\n",
      "[100]\ttrain-auc:0.960847\teval-auc:0.951009\n",
      "[101]\ttrain-auc:0.961025\teval-auc:0.951075\n",
      "[102]\ttrain-auc:0.961195\teval-auc:0.951231\n",
      "[103]\ttrain-auc:0.961233\teval-auc:0.95133\n",
      "[104]\ttrain-auc:0.961457\teval-auc:0.951611\n",
      "[105]\ttrain-auc:0.961613\teval-auc:0.951684\n",
      "[106]\ttrain-auc:0.961729\teval-auc:0.9518\n",
      "[107]\ttrain-auc:0.961925\teval-auc:0.951994\n",
      "[108]\ttrain-auc:0.962095\teval-auc:0.952182\n",
      "[109]\ttrain-auc:0.962242\teval-auc:0.952269\n",
      "[110]\ttrain-auc:0.962434\teval-auc:0.952299\n",
      "[111]\ttrain-auc:0.962647\teval-auc:0.952489\n",
      "[112]\ttrain-auc:0.962775\teval-auc:0.95261\n",
      "[113]\ttrain-auc:0.962876\teval-auc:0.952811\n",
      "[114]\ttrain-auc:0.963021\teval-auc:0.953001\n",
      "[115]\ttrain-auc:0.963201\teval-auc:0.953118\n",
      "[116]\ttrain-auc:0.963372\teval-auc:0.953318\n",
      "[117]\ttrain-auc:0.963506\teval-auc:0.953405\n",
      "[118]\ttrain-auc:0.963596\teval-auc:0.953525\n",
      "[119]\ttrain-auc:0.963539\teval-auc:0.953442\n",
      "[120]\ttrain-auc:0.963694\teval-auc:0.953469\n",
      "[121]\ttrain-auc:0.963832\teval-auc:0.953541\n",
      "[122]\ttrain-auc:0.963952\teval-auc:0.953749\n",
      "[123]\ttrain-auc:0.964081\teval-auc:0.953874\n",
      "[124]\ttrain-auc:0.964164\teval-auc:0.953943\n",
      "[125]\ttrain-auc:0.96425\teval-auc:0.953944\n",
      "[126]\ttrain-auc:0.964323\teval-auc:0.953984\n",
      "[127]\ttrain-auc:0.964448\teval-auc:0.953971\n",
      "[128]\ttrain-auc:0.964624\teval-auc:0.954164\n",
      "[129]\ttrain-auc:0.964721\teval-auc:0.954209\n",
      "[130]\ttrain-auc:0.964761\teval-auc:0.954352\n",
      "[131]\ttrain-auc:0.964821\teval-auc:0.954447\n",
      "[132]\ttrain-auc:0.964976\teval-auc:0.954606\n",
      "[133]\ttrain-auc:0.965072\teval-auc:0.954707\n",
      "[134]\ttrain-auc:0.965227\teval-auc:0.954716\n",
      "[135]\ttrain-auc:0.96543\teval-auc:0.954865\n",
      "[136]\ttrain-auc:0.965573\teval-auc:0.954934\n",
      "[137]\ttrain-auc:0.965772\teval-auc:0.955076\n",
      "[138]\ttrain-auc:0.965791\teval-auc:0.955088\n",
      "[139]\ttrain-auc:0.965969\teval-auc:0.955183\n",
      "[140]\ttrain-auc:0.966029\teval-auc:0.955229\n",
      "[141]\ttrain-auc:0.966107\teval-auc:0.955265\n",
      "[142]\ttrain-auc:0.966295\teval-auc:0.955486\n",
      "[143]\ttrain-auc:0.966423\teval-auc:0.955695\n",
      "[144]\ttrain-auc:0.966519\teval-auc:0.955802\n",
      "[145]\ttrain-auc:0.966628\teval-auc:0.955898\n",
      "[146]\ttrain-auc:0.966674\teval-auc:0.955854\n",
      "[147]\ttrain-auc:0.966754\teval-auc:0.955861\n",
      "[148]\ttrain-auc:0.966779\teval-auc:0.955905\n",
      "[149]\ttrain-auc:0.966852\teval-auc:0.955939\n",
      "[150]\ttrain-auc:0.966927\teval-auc:0.955994\n",
      "[151]\ttrain-auc:0.967033\teval-auc:0.95607\n",
      "[152]\ttrain-auc:0.967191\teval-auc:0.956209\n",
      "[153]\ttrain-auc:0.967316\teval-auc:0.956363\n",
      "[154]\ttrain-auc:0.967424\teval-auc:0.956475\n",
      "[155]\ttrain-auc:0.967594\teval-auc:0.956625\n",
      "[156]\ttrain-auc:0.967683\teval-auc:0.956714\n",
      "[157]\ttrain-auc:0.967744\teval-auc:0.956712\n",
      "[158]\ttrain-auc:0.967816\teval-auc:0.956824\n",
      "[159]\ttrain-auc:0.967885\teval-auc:0.956847\n",
      "[160]\ttrain-auc:0.967913\teval-auc:0.956828\n",
      "[161]\ttrain-auc:0.968013\teval-auc:0.956905\n",
      "[162]\ttrain-auc:0.968043\teval-auc:0.95693\n",
      "[163]\ttrain-auc:0.968152\teval-auc:0.957023\n",
      "[164]\ttrain-auc:0.968212\teval-auc:0.957131\n",
      "[165]\ttrain-auc:0.968285\teval-auc:0.957139\n",
      "[166]\ttrain-auc:0.968387\teval-auc:0.957132\n",
      "[167]\ttrain-auc:0.968481\teval-auc:0.957204\n",
      "[168]\ttrain-auc:0.968566\teval-auc:0.957232\n",
      "[169]\ttrain-auc:0.968691\teval-auc:0.957261\n",
      "[170]\ttrain-auc:0.968836\teval-auc:0.957379\n",
      "[171]\ttrain-auc:0.968846\teval-auc:0.957429\n",
      "[172]\ttrain-auc:0.968978\teval-auc:0.957549\n",
      "[173]\ttrain-auc:0.969099\teval-auc:0.957627\n",
      "[174]\ttrain-auc:0.969121\teval-auc:0.95764\n",
      "[175]\ttrain-auc:0.969196\teval-auc:0.957676\n",
      "[176]\ttrain-auc:0.969284\teval-auc:0.957756\n",
      "[177]\ttrain-auc:0.96936\teval-auc:0.957761\n",
      "[178]\ttrain-auc:0.969374\teval-auc:0.957753\n",
      "[179]\ttrain-auc:0.969505\teval-auc:0.957834\n",
      "[180]\ttrain-auc:0.969539\teval-auc:0.957777\n",
      "[181]\ttrain-auc:0.969626\teval-auc:0.957768\n",
      "[182]\ttrain-auc:0.969692\teval-auc:0.957769\n",
      "[183]\ttrain-auc:0.969777\teval-auc:0.957793\n",
      "[184]\ttrain-auc:0.969887\teval-auc:0.957846\n",
      "[185]\ttrain-auc:0.97002\teval-auc:0.957961\n",
      "[186]\ttrain-auc:0.970101\teval-auc:0.958039\n",
      "[187]\ttrain-auc:0.970156\teval-auc:0.958085\n",
      "[188]\ttrain-auc:0.970186\teval-auc:0.958084\n",
      "[189]\ttrain-auc:0.970258\teval-auc:0.95811\n",
      "[190]\ttrain-auc:0.970325\teval-auc:0.958231\n",
      "[191]\ttrain-auc:0.970364\teval-auc:0.958232\n",
      "[192]\ttrain-auc:0.970526\teval-auc:0.958333\n",
      "[193]\ttrain-auc:0.970585\teval-auc:0.958397\n",
      "[194]\ttrain-auc:0.970606\teval-auc:0.958411\n",
      "[195]\ttrain-auc:0.97071\teval-auc:0.958464\n",
      "[196]\ttrain-auc:0.970781\teval-auc:0.958492\n",
      "[197]\ttrain-auc:0.970865\teval-auc:0.958549\n",
      "[198]\ttrain-auc:0.970886\teval-auc:0.958585\n",
      "[199]\ttrain-auc:0.970963\teval-auc:0.958626\n",
      "[200]\ttrain-auc:0.971042\teval-auc:0.958649\n",
      "[201]\ttrain-auc:0.971114\teval-auc:0.958617\n",
      "[202]\ttrain-auc:0.971117\teval-auc:0.958661\n",
      "[203]\ttrain-auc:0.97115\teval-auc:0.958706\n",
      "[204]\ttrain-auc:0.971229\teval-auc:0.958702\n",
      "[205]\ttrain-auc:0.971287\teval-auc:0.958781\n",
      "[206]\ttrain-auc:0.971331\teval-auc:0.958757\n",
      "[207]\ttrain-auc:0.971429\teval-auc:0.958788\n",
      "[208]\ttrain-auc:0.971477\teval-auc:0.958751\n",
      "[209]\ttrain-auc:0.971538\teval-auc:0.958815\n",
      "[210]\ttrain-auc:0.971573\teval-auc:0.958853\n",
      "[211]\ttrain-auc:0.971636\teval-auc:0.958995\n",
      "[212]\ttrain-auc:0.971719\teval-auc:0.958957\n",
      "[213]\ttrain-auc:0.971816\teval-auc:0.958958\n",
      "[214]\ttrain-auc:0.971916\teval-auc:0.959042\n",
      "[215]\ttrain-auc:0.971986\teval-auc:0.959074\n",
      "[216]\ttrain-auc:0.972103\teval-auc:0.959178\n",
      "[217]\ttrain-auc:0.972199\teval-auc:0.959311\n",
      "[218]\ttrain-auc:0.972256\teval-auc:0.959377\n",
      "[219]\ttrain-auc:0.972273\teval-auc:0.959387\n",
      "[220]\ttrain-auc:0.972297\teval-auc:0.959377\n",
      "[221]\ttrain-auc:0.972325\teval-auc:0.959374\n",
      "[222]\ttrain-auc:0.972362\teval-auc:0.959371\n",
      "[223]\ttrain-auc:0.9724\teval-auc:0.95935\n",
      "[224]\ttrain-auc:0.972499\teval-auc:0.959402\n",
      "[225]\ttrain-auc:0.972533\teval-auc:0.959401\n",
      "[226]\ttrain-auc:0.972572\teval-auc:0.959438\n",
      "[227]\ttrain-auc:0.972626\teval-auc:0.959421\n",
      "[228]\ttrain-auc:0.972659\teval-auc:0.959393\n",
      "[229]\ttrain-auc:0.97269\teval-auc:0.959395\n",
      "[230]\ttrain-auc:0.97274\teval-auc:0.959423\n",
      "[231]\ttrain-auc:0.972798\teval-auc:0.959486\n",
      "[232]\ttrain-auc:0.972818\teval-auc:0.959515\n",
      "[233]\ttrain-auc:0.972888\teval-auc:0.959591\n",
      "[234]\ttrain-auc:0.972898\teval-auc:0.959588\n",
      "[235]\ttrain-auc:0.972929\teval-auc:0.95959\n",
      "[236]\ttrain-auc:0.972991\teval-auc:0.959578\n",
      "[237]\ttrain-auc:0.973065\teval-auc:0.959587\n",
      "[238]\ttrain-auc:0.973135\teval-auc:0.959636\n",
      "[239]\ttrain-auc:0.973192\teval-auc:0.959703\n",
      "[240]\ttrain-auc:0.973248\teval-auc:0.95975\n",
      "[241]\ttrain-auc:0.973286\teval-auc:0.959827\n",
      "[242]\ttrain-auc:0.973334\teval-auc:0.959841\n",
      "[243]\ttrain-auc:0.973339\teval-auc:0.959842\n",
      "[244]\ttrain-auc:0.973394\teval-auc:0.959836\n",
      "[245]\ttrain-auc:0.973444\teval-auc:0.959848\n",
      "[246]\ttrain-auc:0.973523\teval-auc:0.95986\n",
      "[247]\ttrain-auc:0.973564\teval-auc:0.959894\n",
      "[248]\ttrain-auc:0.97362\teval-auc:0.959902\n",
      "[249]\ttrain-auc:0.973666\teval-auc:0.959925\n",
      "[250]\ttrain-auc:0.973697\teval-auc:0.959899\n",
      "[251]\ttrain-auc:0.97375\teval-auc:0.959889\n",
      "[252]\ttrain-auc:0.973784\teval-auc:0.959909\n",
      "[253]\ttrain-auc:0.973836\teval-auc:0.959963\n",
      "[254]\ttrain-auc:0.973875\teval-auc:0.959986\n",
      "[255]\ttrain-auc:0.973916\teval-auc:0.95999\n",
      "[256]\ttrain-auc:0.973997\teval-auc:0.96009\n",
      "[257]\ttrain-auc:0.974056\teval-auc:0.960095\n",
      "[258]\ttrain-auc:0.974124\teval-auc:0.960141\n",
      "[259]\ttrain-auc:0.974154\teval-auc:0.960159\n",
      "[260]\ttrain-auc:0.974236\teval-auc:0.960205\n",
      "[261]\ttrain-auc:0.974347\teval-auc:0.960345\n",
      "[262]\ttrain-auc:0.974366\teval-auc:0.960364\n",
      "[263]\ttrain-auc:0.974415\teval-auc:0.960358\n",
      "[264]\ttrain-auc:0.974502\teval-auc:0.960407\n",
      "[265]\ttrain-auc:0.974547\teval-auc:0.960412\n",
      "[266]\ttrain-auc:0.974598\teval-auc:0.960435\n",
      "[267]\ttrain-auc:0.97469\teval-auc:0.960525\n",
      "[268]\ttrain-auc:0.974717\teval-auc:0.960533\n",
      "[269]\ttrain-auc:0.974756\teval-auc:0.960538\n",
      "[270]\ttrain-auc:0.974775\teval-auc:0.960568\n",
      "[271]\ttrain-auc:0.974826\teval-auc:0.960614\n",
      "[272]\ttrain-auc:0.974885\teval-auc:0.960644\n",
      "[273]\ttrain-auc:0.974919\teval-auc:0.960622\n",
      "[274]\ttrain-auc:0.974962\teval-auc:0.960626\n",
      "[275]\ttrain-auc:0.974998\teval-auc:0.960561\n",
      "[276]\ttrain-auc:0.975012\teval-auc:0.960552\n",
      "[277]\ttrain-auc:0.975085\teval-auc:0.960599\n",
      "[278]\ttrain-auc:0.975111\teval-auc:0.960618\n",
      "[279]\ttrain-auc:0.975113\teval-auc:0.960616\n",
      "[280]\ttrain-auc:0.975143\teval-auc:0.960613\n",
      "[281]\ttrain-auc:0.975165\teval-auc:0.960645\n",
      "[282]\ttrain-auc:0.975207\teval-auc:0.960618\n",
      "[283]\ttrain-auc:0.975242\teval-auc:0.960611\n",
      "[284]\ttrain-auc:0.975276\teval-auc:0.960639\n",
      "[285]\ttrain-auc:0.975323\teval-auc:0.960669\n",
      "[286]\ttrain-auc:0.975386\teval-auc:0.960672\n",
      "[287]\ttrain-auc:0.97545\teval-auc:0.960811\n",
      "[288]\ttrain-auc:0.975481\teval-auc:0.960812\n",
      "[289]\ttrain-auc:0.975547\teval-auc:0.960816\n",
      "[290]\ttrain-auc:0.975594\teval-auc:0.960821\n",
      "[291]\ttrain-auc:0.975614\teval-auc:0.96084\n",
      "[292]\ttrain-auc:0.975716\teval-auc:0.960904\n",
      "[293]\ttrain-auc:0.97573\teval-auc:0.9609\n",
      "[294]\ttrain-auc:0.975762\teval-auc:0.960959\n",
      "[295]\ttrain-auc:0.97577\teval-auc:0.960963\n",
      "[296]\ttrain-auc:0.975823\teval-auc:0.961026\n",
      "[297]\ttrain-auc:0.975937\teval-auc:0.961065\n",
      "[298]\ttrain-auc:0.975957\teval-auc:0.961068\n",
      "[299]\ttrain-auc:0.976027\teval-auc:0.961141\n",
      "[300]\ttrain-auc:0.97608\teval-auc:0.961152\n",
      "[301]\ttrain-auc:0.976133\teval-auc:0.961245\n",
      "[302]\ttrain-auc:0.976194\teval-auc:0.961259\n",
      "[303]\ttrain-auc:0.976217\teval-auc:0.961248\n",
      "[304]\ttrain-auc:0.976266\teval-auc:0.961266\n",
      "[305]\ttrain-auc:0.976299\teval-auc:0.961273\n",
      "[306]\ttrain-auc:0.976347\teval-auc:0.96125\n",
      "[307]\ttrain-auc:0.976357\teval-auc:0.961271\n",
      "[308]\ttrain-auc:0.976381\teval-auc:0.961272\n",
      "[309]\ttrain-auc:0.976436\teval-auc:0.961299\n",
      "[310]\ttrain-auc:0.976473\teval-auc:0.961302\n",
      "[311]\ttrain-auc:0.976497\teval-auc:0.961318\n",
      "[312]\ttrain-auc:0.976576\teval-auc:0.961428\n",
      "[313]\ttrain-auc:0.976597\teval-auc:0.961435\n",
      "[314]\ttrain-auc:0.97661\teval-auc:0.961404\n",
      "[315]\ttrain-auc:0.97666\teval-auc:0.96152\n",
      "[316]\ttrain-auc:0.976751\teval-auc:0.961533\n",
      "[317]\ttrain-auc:0.976784\teval-auc:0.961521\n",
      "[318]\ttrain-auc:0.976801\teval-auc:0.96151\n",
      "[319]\ttrain-auc:0.976827\teval-auc:0.961531\n",
      "[320]\ttrain-auc:0.97689\teval-auc:0.961505\n",
      "[321]\ttrain-auc:0.976967\teval-auc:0.961562\n",
      "[322]\ttrain-auc:0.97701\teval-auc:0.961573\n",
      "[323]\ttrain-auc:0.977018\teval-auc:0.961558\n",
      "[324]\ttrain-auc:0.977048\teval-auc:0.961587\n",
      "[325]\ttrain-auc:0.977119\teval-auc:0.96163\n",
      "[326]\ttrain-auc:0.977138\teval-auc:0.961664\n",
      "[327]\ttrain-auc:0.977178\teval-auc:0.961659\n",
      "[328]\ttrain-auc:0.977209\teval-auc:0.961675\n",
      "[329]\ttrain-auc:0.977235\teval-auc:0.961685\n",
      "[330]\ttrain-auc:0.977301\teval-auc:0.961749\n",
      "[331]\ttrain-auc:0.977371\teval-auc:0.96186\n",
      "[332]\ttrain-auc:0.977411\teval-auc:0.961942\n",
      "[333]\ttrain-auc:0.977449\teval-auc:0.961951\n",
      "[334]\ttrain-auc:0.977464\teval-auc:0.961942\n",
      "[335]\ttrain-auc:0.977479\teval-auc:0.961967\n",
      "[336]\ttrain-auc:0.977554\teval-auc:0.961985\n",
      "[337]\ttrain-auc:0.977583\teval-auc:0.961989\n",
      "[338]\ttrain-auc:0.977629\teval-auc:0.961992\n",
      "[339]\ttrain-auc:0.977649\teval-auc:0.961987\n",
      "[340]\ttrain-auc:0.977647\teval-auc:0.961942\n",
      "[341]\ttrain-auc:0.977676\teval-auc:0.961906\n",
      "[342]\ttrain-auc:0.977735\teval-auc:0.961941\n",
      "[343]\ttrain-auc:0.977787\teval-auc:0.961977\n",
      "[344]\ttrain-auc:0.977812\teval-auc:0.962026\n",
      "[345]\ttrain-auc:0.977876\teval-auc:0.962033\n",
      "[346]\ttrain-auc:0.977938\teval-auc:0.962091\n",
      "[347]\ttrain-auc:0.977943\teval-auc:0.962096\n",
      "[348]\ttrain-auc:0.977953\teval-auc:0.962104\n",
      "[349]\ttrain-auc:0.977988\teval-auc:0.96207\n",
      "[350]\ttrain-auc:0.978028\teval-auc:0.96207\n",
      "[351]\ttrain-auc:0.978049\teval-auc:0.96212\n",
      "[352]\ttrain-auc:0.978077\teval-auc:0.962125\n",
      "[353]\ttrain-auc:0.978075\teval-auc:0.962095\n",
      "[354]\ttrain-auc:0.978095\teval-auc:0.962111\n",
      "[355]\ttrain-auc:0.97811\teval-auc:0.962103\n",
      "[356]\ttrain-auc:0.978145\teval-auc:0.962093\n",
      "[357]\ttrain-auc:0.978178\teval-auc:0.962076\n",
      "[358]\ttrain-auc:0.978212\teval-auc:0.962095\n",
      "[359]\ttrain-auc:0.978221\teval-auc:0.962098\n",
      "[360]\ttrain-auc:0.978245\teval-auc:0.962134\n",
      "[361]\ttrain-auc:0.978339\teval-auc:0.962191\n",
      "[362]\ttrain-auc:0.978356\teval-auc:0.96221\n",
      "[363]\ttrain-auc:0.978359\teval-auc:0.962198\n",
      "[364]\ttrain-auc:0.978411\teval-auc:0.962248\n",
      "[365]\ttrain-auc:0.978469\teval-auc:0.962264\n",
      "[366]\ttrain-auc:0.978506\teval-auc:0.962308\n",
      "[367]\ttrain-auc:0.978534\teval-auc:0.962318\n",
      "[368]\ttrain-auc:0.978551\teval-auc:0.962325\n",
      "[369]\ttrain-auc:0.978606\teval-auc:0.962329\n",
      "[370]\ttrain-auc:0.978637\teval-auc:0.962318\n",
      "[371]\ttrain-auc:0.978672\teval-auc:0.962339\n",
      "[372]\ttrain-auc:0.978716\teval-auc:0.962348\n",
      "[373]\ttrain-auc:0.978752\teval-auc:0.962345\n",
      "[374]\ttrain-auc:0.97881\teval-auc:0.962363\n",
      "[375]\ttrain-auc:0.978841\teval-auc:0.962375\n",
      "[376]\ttrain-auc:0.978859\teval-auc:0.96236\n",
      "[377]\ttrain-auc:0.978913\teval-auc:0.962424\n",
      "[378]\ttrain-auc:0.97897\teval-auc:0.962466\n",
      "[379]\ttrain-auc:0.979005\teval-auc:0.962465\n",
      "[380]\ttrain-auc:0.979056\teval-auc:0.962479\n",
      "[381]\ttrain-auc:0.979072\teval-auc:0.962484\n",
      "[382]\ttrain-auc:0.979084\teval-auc:0.962477\n",
      "[383]\ttrain-auc:0.97912\teval-auc:0.962487\n",
      "[384]\ttrain-auc:0.979159\teval-auc:0.962534\n",
      "[385]\ttrain-auc:0.9792\teval-auc:0.962573\n",
      "[386]\ttrain-auc:0.979228\teval-auc:0.962557\n",
      "[387]\ttrain-auc:0.979267\teval-auc:0.962567\n",
      "[388]\ttrain-auc:0.979294\teval-auc:0.962567\n",
      "[389]\ttrain-auc:0.979316\teval-auc:0.962645\n",
      "[390]\ttrain-auc:0.979341\teval-auc:0.962678\n",
      "[391]\ttrain-auc:0.979385\teval-auc:0.962712\n",
      "[392]\ttrain-auc:0.979402\teval-auc:0.962674\n",
      "[393]\ttrain-auc:0.979445\teval-auc:0.962689\n",
      "[394]\ttrain-auc:0.979466\teval-auc:0.962682\n",
      "[395]\ttrain-auc:0.979501\teval-auc:0.962711\n",
      "[396]\ttrain-auc:0.979511\teval-auc:0.962692\n",
      "[397]\ttrain-auc:0.979513\teval-auc:0.962677\n",
      "[398]\ttrain-auc:0.979536\teval-auc:0.962662\n",
      "[399]\ttrain-auc:0.979596\teval-auc:0.962692\n",
      "[400]\ttrain-auc:0.979606\teval-auc:0.962681\n",
      "[401]\ttrain-auc:0.979642\teval-auc:0.96271\n",
      "[402]\ttrain-auc:0.979672\teval-auc:0.962723\n",
      "[403]\ttrain-auc:0.979695\teval-auc:0.962738\n",
      "[404]\ttrain-auc:0.979728\teval-auc:0.96275\n",
      "[405]\ttrain-auc:0.979784\teval-auc:0.962815\n",
      "[406]\ttrain-auc:0.979816\teval-auc:0.962811\n",
      "[407]\ttrain-auc:0.979835\teval-auc:0.962823\n",
      "[408]\ttrain-auc:0.979908\teval-auc:0.962885\n",
      "[409]\ttrain-auc:0.979918\teval-auc:0.962893\n",
      "[410]\ttrain-auc:0.979958\teval-auc:0.962888\n",
      "[411]\ttrain-auc:0.979974\teval-auc:0.962894\n",
      "[412]\ttrain-auc:0.979995\teval-auc:0.962879\n",
      "[413]\ttrain-auc:0.98001\teval-auc:0.962875\n",
      "[414]\ttrain-auc:0.980061\teval-auc:0.962881\n",
      "[415]\ttrain-auc:0.980103\teval-auc:0.962918\n",
      "[416]\ttrain-auc:0.980128\teval-auc:0.962909\n",
      "[417]\ttrain-auc:0.980153\teval-auc:0.962927\n",
      "[418]\ttrain-auc:0.980162\teval-auc:0.962952\n",
      "[419]\ttrain-auc:0.980189\teval-auc:0.96293\n",
      "[420]\ttrain-auc:0.980197\teval-auc:0.9629\n",
      "[421]\ttrain-auc:0.980219\teval-auc:0.962923\n",
      "[422]\ttrain-auc:0.980248\teval-auc:0.96292\n",
      "[423]\ttrain-auc:0.980276\teval-auc:0.962923\n",
      "[424]\ttrain-auc:0.980287\teval-auc:0.962908\n",
      "[425]\ttrain-auc:0.980316\teval-auc:0.962942\n",
      "[426]\ttrain-auc:0.980359\teval-auc:0.962918\n",
      "[427]\ttrain-auc:0.980388\teval-auc:0.962946\n",
      "[428]\ttrain-auc:0.980419\teval-auc:0.962943\n",
      "[429]\ttrain-auc:0.980431\teval-auc:0.962943\n",
      "[430]\ttrain-auc:0.980444\teval-auc:0.962967\n",
      "[431]\ttrain-auc:0.980465\teval-auc:0.962954\n",
      "[432]\ttrain-auc:0.980496\teval-auc:0.962972\n",
      "[433]\ttrain-auc:0.980524\teval-auc:0.963017\n",
      "[434]\ttrain-auc:0.980574\teval-auc:0.963017\n",
      "[435]\ttrain-auc:0.980609\teval-auc:0.963035\n",
      "[436]\ttrain-auc:0.980625\teval-auc:0.963004\n",
      "[437]\ttrain-auc:0.980667\teval-auc:0.963075\n",
      "[438]\ttrain-auc:0.980685\teval-auc:0.9631\n",
      "[439]\ttrain-auc:0.980748\teval-auc:0.963085\n",
      "[440]\ttrain-auc:0.980756\teval-auc:0.963102\n",
      "[441]\ttrain-auc:0.980801\teval-auc:0.963112\n",
      "[442]\ttrain-auc:0.980825\teval-auc:0.963121\n",
      "[443]\ttrain-auc:0.980862\teval-auc:0.963097\n",
      "[444]\ttrain-auc:0.980887\teval-auc:0.963125\n",
      "[445]\ttrain-auc:0.98092\teval-auc:0.963134\n",
      "[446]\ttrain-auc:0.98096\teval-auc:0.963153\n",
      "[447]\ttrain-auc:0.981009\teval-auc:0.963178\n",
      "[448]\ttrain-auc:0.981068\teval-auc:0.963245\n",
      "[449]\ttrain-auc:0.981078\teval-auc:0.963205\n",
      "[450]\ttrain-auc:0.981112\teval-auc:0.963236\n",
      "[451]\ttrain-auc:0.981152\teval-auc:0.963275\n",
      "[452]\ttrain-auc:0.981183\teval-auc:0.963325\n",
      "[453]\ttrain-auc:0.981226\teval-auc:0.963368\n",
      "[454]\ttrain-auc:0.981285\teval-auc:0.963352\n",
      "[455]\ttrain-auc:0.981294\teval-auc:0.96335\n",
      "[456]\ttrain-auc:0.981309\teval-auc:0.963383\n",
      "[457]\ttrain-auc:0.981361\teval-auc:0.963419\n",
      "[458]\ttrain-auc:0.981376\teval-auc:0.963423\n",
      "[459]\ttrain-auc:0.981376\teval-auc:0.963405\n",
      "[460]\ttrain-auc:0.981363\teval-auc:0.963444\n",
      "[461]\ttrain-auc:0.981394\teval-auc:0.963419\n",
      "[462]\ttrain-auc:0.981417\teval-auc:0.963429\n",
      "[463]\ttrain-auc:0.981436\teval-auc:0.963444\n",
      "[464]\ttrain-auc:0.981465\teval-auc:0.963434\n",
      "[465]\ttrain-auc:0.981509\teval-auc:0.963431\n",
      "[466]\ttrain-auc:0.981577\teval-auc:0.963423\n",
      "[467]\ttrain-auc:0.981616\teval-auc:0.96341\n",
      "[468]\ttrain-auc:0.981656\teval-auc:0.963423\n",
      "[469]\ttrain-auc:0.981692\teval-auc:0.963427\n",
      "[470]\ttrain-auc:0.98173\teval-auc:0.963465\n",
      "[471]\ttrain-auc:0.981789\teval-auc:0.963453\n",
      "[472]\ttrain-auc:0.981814\teval-auc:0.963445\n",
      "[473]\ttrain-auc:0.981841\teval-auc:0.963467\n",
      "[474]\ttrain-auc:0.981863\teval-auc:0.963503\n",
      "[475]\ttrain-auc:0.981874\teval-auc:0.963499\n",
      "[476]\ttrain-auc:0.981897\teval-auc:0.96351\n",
      "[477]\ttrain-auc:0.981936\teval-auc:0.963485\n",
      "[478]\ttrain-auc:0.981957\teval-auc:0.963468\n",
      "[479]\ttrain-auc:0.981959\teval-auc:0.963459\n",
      "[480]\ttrain-auc:0.981983\teval-auc:0.963475\n",
      "[481]\ttrain-auc:0.981996\teval-auc:0.963479\n",
      "[482]\ttrain-auc:0.982021\teval-auc:0.963503\n",
      "[483]\ttrain-auc:0.982039\teval-auc:0.963495\n",
      "[484]\ttrain-auc:0.982041\teval-auc:0.96352\n",
      "[485]\ttrain-auc:0.982073\teval-auc:0.96353\n",
      "[486]\ttrain-auc:0.982093\teval-auc:0.963538\n",
      "[487]\ttrain-auc:0.982137\teval-auc:0.96353\n",
      "[488]\ttrain-auc:0.982146\teval-auc:0.963535\n",
      "[489]\ttrain-auc:0.982174\teval-auc:0.963573\n",
      "[490]\ttrain-auc:0.982208\teval-auc:0.963587\n",
      "[491]\ttrain-auc:0.982252\teval-auc:0.963629\n",
      "[492]\ttrain-auc:0.982283\teval-auc:0.963624\n",
      "[493]\ttrain-auc:0.982289\teval-auc:0.963652\n",
      "[494]\ttrain-auc:0.982304\teval-auc:0.963647\n",
      "[495]\ttrain-auc:0.982314\teval-auc:0.963646\n",
      "[496]\ttrain-auc:0.982339\teval-auc:0.963651\n",
      "[497]\ttrain-auc:0.982362\teval-auc:0.963645\n",
      "[498]\ttrain-auc:0.982365\teval-auc:0.963628\n",
      "[499]\ttrain-auc:0.982395\teval-auc:0.963615\n",
      "[500]\ttrain-auc:0.982413\teval-auc:0.963604\n",
      "[501]\ttrain-auc:0.982482\teval-auc:0.963692\n",
      "[502]\ttrain-auc:0.982537\teval-auc:0.963667\n",
      "[503]\ttrain-auc:0.982571\teval-auc:0.963652\n",
      "[504]\ttrain-auc:0.982607\teval-auc:0.963657\n",
      "[505]\ttrain-auc:0.98263\teval-auc:0.96365\n",
      "[506]\ttrain-auc:0.982657\teval-auc:0.963639\n",
      "[507]\ttrain-auc:0.982689\teval-auc:0.963669\n",
      "[508]\ttrain-auc:0.982721\teval-auc:0.963717\n",
      "[509]\ttrain-auc:0.982736\teval-auc:0.963713\n",
      "[510]\ttrain-auc:0.982794\teval-auc:0.963738\n",
      "[511]\ttrain-auc:0.982816\teval-auc:0.963725\n",
      "[512]\ttrain-auc:0.982839\teval-auc:0.963707\n",
      "[513]\ttrain-auc:0.982884\teval-auc:0.96372\n",
      "[514]\ttrain-auc:0.982932\teval-auc:0.963747\n",
      "[515]\ttrain-auc:0.982971\teval-auc:0.963738\n",
      "[516]\ttrain-auc:0.983012\teval-auc:0.96374\n",
      "[517]\ttrain-auc:0.983038\teval-auc:0.963733\n",
      "[518]\ttrain-auc:0.983058\teval-auc:0.963732\n",
      "[519]\ttrain-auc:0.983073\teval-auc:0.963725\n",
      "[520]\ttrain-auc:0.983111\teval-auc:0.963774\n",
      "[521]\ttrain-auc:0.983159\teval-auc:0.963834\n",
      "[522]\ttrain-auc:0.983177\teval-auc:0.963829\n",
      "[523]\ttrain-auc:0.983192\teval-auc:0.963831\n",
      "[524]\ttrain-auc:0.98325\teval-auc:0.963863\n",
      "[525]\ttrain-auc:0.983307\teval-auc:0.963847\n",
      "[526]\ttrain-auc:0.983326\teval-auc:0.963832\n",
      "[527]\ttrain-auc:0.983347\teval-auc:0.963853\n",
      "[528]\ttrain-auc:0.983374\teval-auc:0.963848\n",
      "[529]\ttrain-auc:0.983399\teval-auc:0.963862\n",
      "[530]\ttrain-auc:0.983423\teval-auc:0.963884\n",
      "[531]\ttrain-auc:0.983429\teval-auc:0.963897\n",
      "[532]\ttrain-auc:0.983437\teval-auc:0.963905\n",
      "[533]\ttrain-auc:0.983467\teval-auc:0.963892\n",
      "[534]\ttrain-auc:0.983518\teval-auc:0.96391\n",
      "[535]\ttrain-auc:0.983553\teval-auc:0.963932\n",
      "[536]\ttrain-auc:0.983592\teval-auc:0.963911\n",
      "[537]\ttrain-auc:0.983601\teval-auc:0.963929\n",
      "[538]\ttrain-auc:0.983618\teval-auc:0.963949\n",
      "[539]\ttrain-auc:0.983652\teval-auc:0.963953\n",
      "[540]\ttrain-auc:0.983667\teval-auc:0.963964\n",
      "[541]\ttrain-auc:0.983678\teval-auc:0.963963\n",
      "[542]\ttrain-auc:0.983689\teval-auc:0.963954\n",
      "[543]\ttrain-auc:0.983711\teval-auc:0.963956\n",
      "[544]\ttrain-auc:0.983718\teval-auc:0.963947\n",
      "[545]\ttrain-auc:0.983731\teval-auc:0.963966\n",
      "[546]\ttrain-auc:0.983739\teval-auc:0.963964\n",
      "[547]\ttrain-auc:0.98375\teval-auc:0.963973\n",
      "[548]\ttrain-auc:0.98376\teval-auc:0.963969\n",
      "[549]\ttrain-auc:0.983777\teval-auc:0.963967\n",
      "[550]\ttrain-auc:0.983818\teval-auc:0.963977\n",
      "[551]\ttrain-auc:0.98384\teval-auc:0.963968\n",
      "[552]\ttrain-auc:0.983862\teval-auc:0.963986\n",
      "[553]\ttrain-auc:0.983879\teval-auc:0.964006\n",
      "[554]\ttrain-auc:0.983897\teval-auc:0.964027\n",
      "[555]\ttrain-auc:0.983922\teval-auc:0.964\n",
      "[556]\ttrain-auc:0.983931\teval-auc:0.964015\n",
      "[557]\ttrain-auc:0.983952\teval-auc:0.964045\n",
      "[558]\ttrain-auc:0.983959\teval-auc:0.964055\n",
      "[559]\ttrain-auc:0.983978\teval-auc:0.964075\n",
      "[560]\ttrain-auc:0.983991\teval-auc:0.964088\n",
      "[561]\ttrain-auc:0.984003\teval-auc:0.964081\n",
      "[562]\ttrain-auc:0.984025\teval-auc:0.964081\n",
      "[563]\ttrain-auc:0.984055\teval-auc:0.96406\n",
      "[564]\ttrain-auc:0.984069\teval-auc:0.964039\n",
      "[565]\ttrain-auc:0.984094\teval-auc:0.963995\n",
      "[566]\ttrain-auc:0.984124\teval-auc:0.964034\n",
      "[567]\ttrain-auc:0.984128\teval-auc:0.964031\n",
      "[568]\ttrain-auc:0.984159\teval-auc:0.964065\n",
      "[569]\ttrain-auc:0.984164\teval-auc:0.964065\n",
      "[570]\ttrain-auc:0.984189\teval-auc:0.964067\n",
      "[571]\ttrain-auc:0.984219\teval-auc:0.964112\n",
      "[572]\ttrain-auc:0.984234\teval-auc:0.964094\n",
      "[573]\ttrain-auc:0.984244\teval-auc:0.964125\n",
      "[574]\ttrain-auc:0.984288\teval-auc:0.964126\n",
      "[575]\ttrain-auc:0.984315\teval-auc:0.964148\n",
      "[576]\ttrain-auc:0.984324\teval-auc:0.96415\n",
      "[577]\ttrain-auc:0.984356\teval-auc:0.964163\n",
      "[578]\ttrain-auc:0.984387\teval-auc:0.964182\n",
      "[579]\ttrain-auc:0.984416\teval-auc:0.964182\n",
      "[580]\ttrain-auc:0.984419\teval-auc:0.964201\n",
      "[581]\ttrain-auc:0.984428\teval-auc:0.964189\n",
      "[582]\ttrain-auc:0.984432\teval-auc:0.964192\n",
      "[583]\ttrain-auc:0.984455\teval-auc:0.964193\n",
      "[584]\ttrain-auc:0.984485\teval-auc:0.964215\n",
      "[585]\ttrain-auc:0.984506\teval-auc:0.964224\n",
      "[586]\ttrain-auc:0.984527\teval-auc:0.964244\n",
      "[587]\ttrain-auc:0.984563\teval-auc:0.96427\n",
      "[588]\ttrain-auc:0.984578\teval-auc:0.964274\n",
      "[589]\ttrain-auc:0.984624\teval-auc:0.96429\n",
      "[590]\ttrain-auc:0.984654\teval-auc:0.964311\n",
      "[591]\ttrain-auc:0.984663\teval-auc:0.964305\n",
      "[592]\ttrain-auc:0.984675\teval-auc:0.964323\n",
      "[593]\ttrain-auc:0.984702\teval-auc:0.964321\n",
      "[594]\ttrain-auc:0.984745\teval-auc:0.964345\n",
      "[595]\ttrain-auc:0.984753\teval-auc:0.964367\n",
      "[596]\ttrain-auc:0.984788\teval-auc:0.964353\n",
      "[597]\ttrain-auc:0.984818\teval-auc:0.964376\n",
      "[598]\ttrain-auc:0.984839\teval-auc:0.964347\n",
      "[599]\ttrain-auc:0.984861\teval-auc:0.964371\n",
      "[600]\ttrain-auc:0.984882\teval-auc:0.96437\n",
      "[601]\ttrain-auc:0.984865\teval-auc:0.964361\n",
      "[602]\ttrain-auc:0.984903\teval-auc:0.96437\n",
      "[603]\ttrain-auc:0.984927\teval-auc:0.964341\n",
      "[604]\ttrain-auc:0.98496\teval-auc:0.964356\n",
      "[605]\ttrain-auc:0.984964\teval-auc:0.964347\n",
      "[606]\ttrain-auc:0.985002\teval-auc:0.964372\n",
      "[607]\ttrain-auc:0.985028\teval-auc:0.964399\n",
      "[608]\ttrain-auc:0.985041\teval-auc:0.964419\n",
      "[609]\ttrain-auc:0.98504\teval-auc:0.964407\n",
      "[610]\ttrain-auc:0.985066\teval-auc:0.964428\n",
      "[611]\ttrain-auc:0.985083\teval-auc:0.964431\n",
      "[612]\ttrain-auc:0.9851\teval-auc:0.964403\n",
      "[613]\ttrain-auc:0.985126\teval-auc:0.964402\n",
      "[614]\ttrain-auc:0.985156\teval-auc:0.964374\n",
      "[615]\ttrain-auc:0.985168\teval-auc:0.964411\n",
      "[616]\ttrain-auc:0.985192\teval-auc:0.964432\n",
      "[617]\ttrain-auc:0.985205\teval-auc:0.96441\n",
      "[618]\ttrain-auc:0.985208\teval-auc:0.964399\n",
      "[619]\ttrain-auc:0.98522\teval-auc:0.964402\n",
      "[620]\ttrain-auc:0.985239\teval-auc:0.964403\n",
      "[621]\ttrain-auc:0.985258\teval-auc:0.964445\n",
      "[622]\ttrain-auc:0.985289\teval-auc:0.964461\n",
      "[623]\ttrain-auc:0.985302\teval-auc:0.964443\n",
      "[624]\ttrain-auc:0.985307\teval-auc:0.964434\n",
      "[625]\ttrain-auc:0.98533\teval-auc:0.964436\n",
      "[626]\ttrain-auc:0.98534\teval-auc:0.964437\n",
      "[627]\ttrain-auc:0.985358\teval-auc:0.964406\n",
      "[628]\ttrain-auc:0.985369\teval-auc:0.9644\n",
      "[629]\ttrain-auc:0.985386\teval-auc:0.964424\n",
      "[630]\ttrain-auc:0.985407\teval-auc:0.964437\n",
      "[631]\ttrain-auc:0.985416\teval-auc:0.964429\n",
      "[632]\ttrain-auc:0.985467\teval-auc:0.964481\n",
      "[633]\ttrain-auc:0.985493\teval-auc:0.964474\n",
      "[634]\ttrain-auc:0.985506\teval-auc:0.964456\n",
      "[635]\ttrain-auc:0.985522\teval-auc:0.964443\n",
      "[636]\ttrain-auc:0.985546\teval-auc:0.964457\n",
      "[637]\ttrain-auc:0.985547\teval-auc:0.964452\n",
      "[638]\ttrain-auc:0.985564\teval-auc:0.964481\n",
      "[639]\ttrain-auc:0.985607\teval-auc:0.964456\n",
      "[640]\ttrain-auc:0.985599\teval-auc:0.964456\n",
      "[641]\ttrain-auc:0.985654\teval-auc:0.964487\n",
      "[642]\ttrain-auc:0.985667\teval-auc:0.964486\n",
      "[643]\ttrain-auc:0.985671\teval-auc:0.964467\n",
      "[644]\ttrain-auc:0.985723\teval-auc:0.964464\n",
      "[645]\ttrain-auc:0.985745\teval-auc:0.964477\n",
      "[646]\ttrain-auc:0.985778\teval-auc:0.964489\n",
      "[647]\ttrain-auc:0.985788\teval-auc:0.964473\n",
      "[648]\ttrain-auc:0.985817\teval-auc:0.964436\n",
      "[649]\ttrain-auc:0.985851\teval-auc:0.964463\n",
      "[650]\ttrain-auc:0.985851\teval-auc:0.96447\n",
      "[651]\ttrain-auc:0.985856\teval-auc:0.964452\n",
      "[652]\ttrain-auc:0.985861\teval-auc:0.964441\n",
      "[653]\ttrain-auc:0.985903\teval-auc:0.964465\n",
      "[654]\ttrain-auc:0.985918\teval-auc:0.964449\n",
      "[655]\ttrain-auc:0.985935\teval-auc:0.964433\n",
      "[656]\ttrain-auc:0.98594\teval-auc:0.964416\n",
      "[657]\ttrain-auc:0.985951\teval-auc:0.964419\n",
      "[658]\ttrain-auc:0.985965\teval-auc:0.964413\n",
      "[659]\ttrain-auc:0.985996\teval-auc:0.964451\n",
      "[660]\ttrain-auc:0.986017\teval-auc:0.964468\n",
      "[661]\ttrain-auc:0.986051\teval-auc:0.964506\n",
      "[662]\ttrain-auc:0.986062\teval-auc:0.964498\n",
      "[663]\ttrain-auc:0.986051\teval-auc:0.964481\n",
      "[664]\ttrain-auc:0.98607\teval-auc:0.964468\n",
      "[665]\ttrain-auc:0.986084\teval-auc:0.964482\n",
      "[666]\ttrain-auc:0.986129\teval-auc:0.964519\n",
      "[667]\ttrain-auc:0.986166\teval-auc:0.964526\n",
      "[668]\ttrain-auc:0.986172\teval-auc:0.964545\n",
      "[669]\ttrain-auc:0.986189\teval-auc:0.964537\n",
      "[670]\ttrain-auc:0.986224\teval-auc:0.964534\n",
      "[671]\ttrain-auc:0.986241\teval-auc:0.964553\n",
      "[672]\ttrain-auc:0.986296\teval-auc:0.96458\n",
      "[673]\ttrain-auc:0.986289\teval-auc:0.964568\n",
      "[674]\ttrain-auc:0.986313\teval-auc:0.964567\n",
      "[675]\ttrain-auc:0.986318\teval-auc:0.964576\n",
      "[676]\ttrain-auc:0.98635\teval-auc:0.964597\n",
      "[677]\ttrain-auc:0.986368\teval-auc:0.964601\n",
      "[678]\ttrain-auc:0.986388\teval-auc:0.964608\n",
      "[679]\ttrain-auc:0.986421\teval-auc:0.964599\n",
      "[680]\ttrain-auc:0.98645\teval-auc:0.964603\n",
      "[681]\ttrain-auc:0.986454\teval-auc:0.964619\n",
      "[682]\ttrain-auc:0.986446\teval-auc:0.96462\n",
      "[683]\ttrain-auc:0.986453\teval-auc:0.964627\n",
      "[684]\ttrain-auc:0.98648\teval-auc:0.964626\n",
      "[685]\ttrain-auc:0.986493\teval-auc:0.964635\n",
      "[686]\ttrain-auc:0.9865\teval-auc:0.964613\n",
      "[687]\ttrain-auc:0.986532\teval-auc:0.964611\n",
      "[688]\ttrain-auc:0.986549\teval-auc:0.964587\n",
      "[689]\ttrain-auc:0.986556\teval-auc:0.964589\n",
      "[690]\ttrain-auc:0.986575\teval-auc:0.964586\n",
      "[691]\ttrain-auc:0.986617\teval-auc:0.964614\n",
      "[692]\ttrain-auc:0.986633\teval-auc:0.964639\n",
      "[693]\ttrain-auc:0.986649\teval-auc:0.964657\n",
      "[694]\ttrain-auc:0.986652\teval-auc:0.964664\n",
      "[695]\ttrain-auc:0.986668\teval-auc:0.964665\n",
      "[696]\ttrain-auc:0.986688\teval-auc:0.964659\n",
      "[697]\ttrain-auc:0.986708\teval-auc:0.964642\n",
      "[698]\ttrain-auc:0.986722\teval-auc:0.964628\n",
      "[699]\ttrain-auc:0.986731\teval-auc:0.964615\n",
      "[700]\ttrain-auc:0.986746\teval-auc:0.964613\n",
      "[701]\ttrain-auc:0.986771\teval-auc:0.964584\n",
      "[702]\ttrain-auc:0.986807\teval-auc:0.964602\n",
      "[703]\ttrain-auc:0.986839\teval-auc:0.96462\n",
      "[704]\ttrain-auc:0.98686\teval-auc:0.964617\n",
      "[705]\ttrain-auc:0.986883\teval-auc:0.964598\n",
      "[706]\ttrain-auc:0.986886\teval-auc:0.964612\n",
      "[707]\ttrain-auc:0.986898\teval-auc:0.964617\n",
      "[708]\ttrain-auc:0.986906\teval-auc:0.964595\n",
      "[709]\ttrain-auc:0.986915\teval-auc:0.964583\n",
      "[710]\ttrain-auc:0.986948\teval-auc:0.964582\n",
      "[711]\ttrain-auc:0.986968\teval-auc:0.96456\n",
      "[712]\ttrain-auc:0.98698\teval-auc:0.964572\n",
      "[713]\ttrain-auc:0.986991\teval-auc:0.964584\n",
      "[714]\ttrain-auc:0.987005\teval-auc:0.964599\n",
      "[715]\ttrain-auc:0.987007\teval-auc:0.964632\n",
      "Stopping. Best iteration:\n",
      "[695]\ttrain-auc:0.986668\teval-auc:0.964665\n",
      "\n",
      "[  6.78857759e-05   2.63897469e-04   6.62131142e-03 ...,   1.99609071e-01\n",
      "   1.01986183e-02   3.95350635e-01]\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/anaconda3/envs/tf/lib/python3.5/site-packages/ipykernel_launcher.py:60: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n"
     ]
    }
   ],
   "source": [
    "train_feat = train.drop(['userid','orderType'],axis=1)\n",
    "trainain_label = train['orderType']\n",
    "\n",
    "\n",
    "test_feat = test.drop(['userid','orderType'],axis=1)\n",
    "test_index = test[['userid']]\n",
    "\n",
    "\n",
    "from  sklearn.model_selection import train_test_split\n",
    "from  sklearn.model_selection import train_test_split\n",
    "train_x,val_x,train_y,val_y = train_test_split(train_feat,trainain_label,test_size=0.3,random_state=1)\n",
    "\n",
    "\n",
    "\n",
    "import xgboost as xgb\n",
    "dtrain = xgb.DMatrix(train_x,label=train_y)\n",
    "dval = xgb.DMatrix(val_x,val_y)\n",
    "\n",
    "param = {\n",
    "    'max_depth':3, \n",
    "    'learning_rate':0.1,\n",
    "      'n_estimators':10000, \n",
    "      'silent':False, \n",
    "      'objective':'binary:logistic', \n",
    "      'booster':'gbtree', \n",
    "      'n_jobs':10, \n",
    "      'nthread':100, \n",
    "      'gamma':0, \n",
    "      'min_child_weight':1,\n",
    "      'max_delta_step':0, \n",
    "      'subsample':0.8, \n",
    "      'colsample_bytree':0.8, \n",
    "      'colsample_bylevel':0.8, \n",
    "      'reg_alpha':0.2, \n",
    "      'reg_lambda':0.8, \n",
    "      'scale_pos_weight':0.16, \n",
    "      'seed':2017\n",
    "    \n",
    "#     'learning_rate':0.1,\n",
    "#     'n_estimators':1000,\n",
    "#     'max_depth':3,\n",
    "#     'gamma': 0.05,\n",
    "#     'subsample': 0.8,\n",
    "#     'colsample_bytree': 0.8,\n",
    "#     'eta': 0.03,\n",
    "#     'silent': 1,\n",
    "#     'objective':'binary:logistic',\n",
    "#     'scale_pos_weight':1\n",
    "}\n",
    "num_round =5000\n",
    "plst = list(param.items())\n",
    "plst +=[('eval_metric','auc')]\n",
    "evallist = [(dtrain,'train'),(dval,'eval')]\n",
    "\n",
    "bst = xgb.train(plst,dtrain,num_round,evallist,early_stopping_rounds=20)\n",
    "\n",
    "dtest = xgb.DMatrix(test_feat)\n",
    "pred = bst.predict(dtest)\n",
    "print(pred)\n",
    "test_index['orderType'] = pred\n",
    "test_index.to_csv('../result/sumbit_huang.csv',index=False)\n",
    "# param = {'learning_rate' : 0.1,\n",
    "#         'n_estimators': 1000,\n",
    "#         'max_depth': 2,\n",
    "#         'min_child_weight': 3,\n",
    "#         'gamma': 0,\n",
    "#         'subsample': 0.8,\n",
    "#         'colsample_bytree': 0.8,\n",
    "#         'eta': 0.03,\n",
    "#         'silent': 1,\n",
    "#         'objective':\n",
    "# #          'binary:logistic',\n",
    "#         'reg:linear',\n",
    "#         'scale_pos_weight':1}\n",
    "# num_round =150\n",
    "# plst = list(param.items())\n",
    "# plst += [('eval_metric', 'rmse')]\n",
    "# # plst += [('eval_metric', 'logloss')]\n",
    "# evallist = [ (dtrain, 'train'),(dval, 'eval')]\n",
    "# bst=xgb.train(plst,dtrain,num_round,evallist,early_stopping_rounds=30)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "finish\n",
      "2018-02-07 15:58:39.266488\n",
      "2018-02-07 16:11:55.201233\n",
      "     test-auc-mean  test-auc-std  train-auc-mean  train-auc-std\n",
      "0         0.803054      0.007568        0.803123       0.001689\n",
      "1         0.849834      0.015513        0.850619       0.012620\n",
      "2         0.866174      0.012089        0.868053       0.007983\n",
      "3         0.872391      0.010575        0.874542       0.005891\n",
      "4         0.876466      0.010079        0.878689       0.006872\n",
      "5         0.880387      0.010089        0.883127       0.006033\n",
      "6         0.883232      0.008673        0.886688       0.003897\n",
      "7         0.888437      0.008777        0.891624       0.004019\n",
      "8         0.890775      0.008388        0.893335       0.003048\n",
      "9         0.891619      0.008542        0.894615       0.003344\n",
      "10        0.894401      0.008321        0.897114       0.003231\n",
      "11        0.895698      0.008097        0.898562       0.003473\n",
      "12        0.898759      0.005662        0.900825       0.002828\n",
      "13        0.899742      0.005533        0.902400       0.002026\n",
      "14        0.901733      0.004440        0.904107       0.002147\n",
      "15        0.903295      0.005124        0.905908       0.001939\n",
      "16        0.904406      0.005422        0.907060       0.001728\n",
      "17        0.906494      0.005692        0.908400       0.001462\n",
      "18        0.907209      0.005367        0.909245       0.001787\n",
      "19        0.908167      0.005206        0.910543       0.002374\n",
      "20        0.910118      0.005399        0.912301       0.002017\n",
      "21        0.911713      0.005994        0.914093       0.001652\n",
      "22        0.912819      0.006203        0.915390       0.001378\n",
      "23        0.914214      0.005817        0.916840       0.001243\n",
      "24        0.915730      0.005741        0.918065       0.001002\n",
      "25        0.917098      0.006311        0.919741       0.000911\n",
      "26        0.917847      0.006405        0.920906       0.000982\n",
      "27        0.919689      0.005852        0.922639       0.001339\n",
      "28        0.920736      0.006053        0.924013       0.001173\n",
      "29        0.922157      0.006301        0.925878       0.001309\n",
      "..             ...           ...             ...            ...\n",
      "497       0.967532      0.003762        0.987971       0.000279\n",
      "498       0.967552      0.003755        0.987991       0.000282\n",
      "499       0.967557      0.003745        0.988019       0.000283\n",
      "500       0.967557      0.003739        0.988042       0.000286\n",
      "501       0.967560      0.003748        0.988070       0.000285\n",
      "502       0.967576      0.003766        0.988102       0.000281\n",
      "503       0.967560      0.003768        0.988129       0.000275\n",
      "504       0.967565      0.003767        0.988151       0.000277\n",
      "505       0.967575      0.003765        0.988185       0.000274\n",
      "506       0.967576      0.003748        0.988210       0.000270\n",
      "507       0.967578      0.003742        0.988241       0.000270\n",
      "508       0.967591      0.003735        0.988278       0.000264\n",
      "509       0.967594      0.003732        0.988302       0.000265\n",
      "510       0.967597      0.003743        0.988333       0.000265\n",
      "511       0.967596      0.003747        0.988354       0.000268\n",
      "512       0.967613      0.003770        0.988376       0.000264\n",
      "513       0.967635      0.003772        0.988402       0.000262\n",
      "514       0.967638      0.003774        0.988416       0.000257\n",
      "515       0.967634      0.003778        0.988436       0.000258\n",
      "516       0.967644      0.003772        0.988461       0.000263\n",
      "517       0.967657      0.003769        0.988492       0.000263\n",
      "518       0.967664      0.003773        0.988510       0.000265\n",
      "519       0.967675      0.003779        0.988542       0.000264\n",
      "520       0.967686      0.003766        0.988565       0.000262\n",
      "521       0.967693      0.003763        0.988591       0.000261\n",
      "522       0.967715      0.003760        0.988615       0.000257\n",
      "523       0.967726      0.003743        0.988640       0.000261\n",
      "524       0.967746      0.003755        0.988668       0.000253\n",
      "525       0.967751      0.003746        0.988692       0.000254\n",
      "526       0.967758      0.003738        0.988716       0.000255\n",
      "\n",
      "[527 rows x 4 columns]\n",
      "526\n",
      "[  4.51870699e-04   2.72441481e-04   1.48409128e-03 ...,   2.30203286e-01\n",
      "   6.44039642e-03   3.49723160e-01]\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/anaconda3/envs/tf/lib/python3.5/site-packages/ipykernel_launcher.py:45: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n"
     ]
    }
   ],
   "source": [
    "import xgboost as xgb\n",
    "def xgb_train_online_find_best_round(bst,train_feat,train_label): \n",
    "    xgb_param = bst.get_xgb_params()  \n",
    "    dtrain = xgb.DMatrix(train_feat,label=train_label)\n",
    "    import datetime\n",
    "    print(datetime.datetime.now())\n",
    "    df = xgb.cv(xgb_param,dtrain,num_boost_round=bst.get_params()['n_estimators'],nfold=10,metrics='auc',early_stopping_rounds=20)\n",
    "    print(datetime.datetime.now())\n",
    "    print(df)\n",
    "    nums = np.argmax(df['test-auc-mean'])\n",
    "    bst.set_params(n_estimators=nums)\n",
    "    print(nums)\n",
    "    return bst\n",
    "print('finish')\n",
    "bst=xgb.XGBClassifier(max_depth=4, learning_rate=0.1,\n",
    "              n_estimators=20000, \n",
    "              silent=False, \n",
    "              objective='binary:logistic', \n",
    "              booster='gbtree', \n",
    "              n_jobs=1000, \n",
    "              nthread=1000, \n",
    "              gamma=0.2, \n",
    "              min_child_weight=1,\n",
    "              max_delta_step=0, \n",
    "              subsample=0.8, \n",
    "              colsample_bytree=0.8, \n",
    "              colsample_bylevel=0.8, \n",
    "              reg_alpha=0.3, \n",
    "              reg_lambda=0.7, \n",
    "              scale_pos_weight=0.16, \n",
    "              seed=2017001)\n",
    "# \n",
    "train_feat = train.drop(['userid','orderType'],axis=1)\n",
    "train_label = train['orderType']\n",
    "\n",
    "test_feat = test.drop(['userid','orderType'],axis=1)\n",
    "test_index = test[['userid']]\n",
    "bst = xgb_train_online_find_best_round(bst,train_feat,train_label)\n",
    "bst.fit(train_feat, train_label,eval_metric='auc')\n",
    "# pred = bst.predict(test_feat)\n",
    "# test_index['orderType'] = pred\n",
    "pred = bst.predict_proba(test_feat)\n",
    "print(pred[:,1])\n",
    "# print(pred)\n",
    "test_index['orderType'] = pred[:,1]\n",
    "# test_index['orderType'] = 1-test_index['orderType']\n",
    "test_index.to_csv('../result/sumbitA榜第一_10次交叉验证.csv',index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([  2.67035095e-04,   1.47664192e-04,   9.29265458e-04, ...,\n",
       "         2.41130635e-01,   6.16431888e-03,   4.37435776e-01], dtype=float32)"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pred[:,1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "train-auc:0.983579\teval-auc:0.964541"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1]\ttraining's auc: 0.858575\tvalid_1's auc: 0.847633\n",
      "Training until validation scores don't improve for 20 rounds.\n",
      "[2]\ttraining's auc: 0.862283\tvalid_1's auc: 0.851121\n",
      "[3]\ttraining's auc: 0.869795\tvalid_1's auc: 0.860191\n",
      "[4]\ttraining's auc: 0.869807\tvalid_1's auc: 0.860089\n",
      "[5]\ttraining's auc: 0.874537\tvalid_1's auc: 0.863153\n",
      "[6]\ttraining's auc: 0.874929\tvalid_1's auc: 0.863522\n",
      "[7]\ttraining's auc: 0.894473\tvalid_1's auc: 0.880768\n",
      "[8]\ttraining's auc: 0.904134\tvalid_1's auc: 0.888548\n",
      "[9]\ttraining's auc: 0.905432\tvalid_1's auc: 0.889405\n",
      "[10]\ttraining's auc: 0.90595\tvalid_1's auc: 0.890393\n",
      "[11]\ttraining's auc: 0.905635\tvalid_1's auc: 0.89029\n",
      "[12]\ttraining's auc: 0.905674\tvalid_1's auc: 0.891024\n",
      "[13]\ttraining's auc: 0.906168\tvalid_1's auc: 0.891569\n",
      "[14]\ttraining's auc: 0.908661\tvalid_1's auc: 0.895188\n",
      "[15]\ttraining's auc: 0.909064\tvalid_1's auc: 0.895747\n",
      "[16]\ttraining's auc: 0.909705\tvalid_1's auc: 0.896933\n",
      "[17]\ttraining's auc: 0.912682\tvalid_1's auc: 0.899626\n",
      "[18]\ttraining's auc: 0.912753\tvalid_1's auc: 0.899473\n",
      "[19]\ttraining's auc: 0.913659\tvalid_1's auc: 0.900421\n",
      "[20]\ttraining's auc: 0.913977\tvalid_1's auc: 0.90041\n",
      "[21]\ttraining's auc: 0.914213\tvalid_1's auc: 0.900027\n",
      "[22]\ttraining's auc: 0.915894\tvalid_1's auc: 0.901941\n",
      "[23]\ttraining's auc: 0.916785\tvalid_1's auc: 0.902629\n",
      "[24]\ttraining's auc: 0.918262\tvalid_1's auc: 0.903963\n",
      "[25]\ttraining's auc: 0.921728\tvalid_1's auc: 0.908188\n",
      "[26]\ttraining's auc: 0.924322\tvalid_1's auc: 0.910866\n",
      "[27]\ttraining's auc: 0.924887\tvalid_1's auc: 0.911637\n",
      "[28]\ttraining's auc: 0.926416\tvalid_1's auc: 0.913469\n",
      "[29]\ttraining's auc: 0.926776\tvalid_1's auc: 0.913903\n",
      "[30]\ttraining's auc: 0.927508\tvalid_1's auc: 0.914549\n",
      "[31]\ttraining's auc: 0.927868\tvalid_1's auc: 0.914946\n",
      "[32]\ttraining's auc: 0.930286\tvalid_1's auc: 0.917765\n",
      "[33]\ttraining's auc: 0.931962\tvalid_1's auc: 0.919613\n",
      "[34]\ttraining's auc: 0.93306\tvalid_1's auc: 0.920772\n",
      "[35]\ttraining's auc: 0.933417\tvalid_1's auc: 0.921312\n",
      "[36]\ttraining's auc: 0.935289\tvalid_1's auc: 0.923109\n",
      "[37]\ttraining's auc: 0.936569\tvalid_1's auc: 0.924223\n",
      "[38]\ttraining's auc: 0.938286\tvalid_1's auc: 0.925899\n",
      "[39]\ttraining's auc: 0.939047\tvalid_1's auc: 0.926199\n",
      "[40]\ttraining's auc: 0.939916\tvalid_1's auc: 0.92702\n",
      "[41]\ttraining's auc: 0.941143\tvalid_1's auc: 0.928355\n",
      "[42]\ttraining's auc: 0.942692\tvalid_1's auc: 0.930057\n",
      "[43]\ttraining's auc: 0.943459\tvalid_1's auc: 0.930928\n",
      "[44]\ttraining's auc: 0.94467\tvalid_1's auc: 0.932157\n",
      "[45]\ttraining's auc: 0.94505\tvalid_1's auc: 0.93263\n",
      "[46]\ttraining's auc: 0.945644\tvalid_1's auc: 0.933339\n",
      "[47]\ttraining's auc: 0.946385\tvalid_1's auc: 0.934125\n",
      "[48]\ttraining's auc: 0.946908\tvalid_1's auc: 0.93457\n",
      "[49]\ttraining's auc: 0.948419\tvalid_1's auc: 0.936745\n",
      "[50]\ttraining's auc: 0.949219\tvalid_1's auc: 0.937774\n",
      "[51]\ttraining's auc: 0.949895\tvalid_1's auc: 0.938466\n",
      "[52]\ttraining's auc: 0.950514\tvalid_1's auc: 0.939127\n",
      "[53]\ttraining's auc: 0.950667\tvalid_1's auc: 0.939032\n",
      "[54]\ttraining's auc: 0.951519\tvalid_1's auc: 0.940014\n",
      "[55]\ttraining's auc: 0.952463\tvalid_1's auc: 0.940992\n",
      "[56]\ttraining's auc: 0.953294\tvalid_1's auc: 0.942149\n",
      "[57]\ttraining's auc: 0.953929\tvalid_1's auc: 0.942908\n",
      "[58]\ttraining's auc: 0.954524\tvalid_1's auc: 0.943811\n",
      "[59]\ttraining's auc: 0.955103\tvalid_1's auc: 0.944383\n",
      "[60]\ttraining's auc: 0.955608\tvalid_1's auc: 0.944975\n",
      "[61]\ttraining's auc: 0.955848\tvalid_1's auc: 0.945338\n",
      "[62]\ttraining's auc: 0.956076\tvalid_1's auc: 0.945569\n",
      "[63]\ttraining's auc: 0.956513\tvalid_1's auc: 0.946107\n",
      "[64]\ttraining's auc: 0.957085\tvalid_1's auc: 0.946705\n",
      "[65]\ttraining's auc: 0.957488\tvalid_1's auc: 0.946883\n",
      "[66]\ttraining's auc: 0.957978\tvalid_1's auc: 0.947508\n",
      "[67]\ttraining's auc: 0.958255\tvalid_1's auc: 0.947859\n",
      "[68]\ttraining's auc: 0.958446\tvalid_1's auc: 0.948051\n",
      "[69]\ttraining's auc: 0.9591\tvalid_1's auc: 0.948658\n",
      "[70]\ttraining's auc: 0.959331\tvalid_1's auc: 0.948947\n",
      "[71]\ttraining's auc: 0.959676\tvalid_1's auc: 0.949307\n",
      "[72]\ttraining's auc: 0.959971\tvalid_1's auc: 0.949647\n",
      "[73]\ttraining's auc: 0.960219\tvalid_1's auc: 0.950032\n",
      "[74]\ttraining's auc: 0.960638\tvalid_1's auc: 0.950351\n",
      "[75]\ttraining's auc: 0.961008\tvalid_1's auc: 0.950664\n",
      "[76]\ttraining's auc: 0.961299\tvalid_1's auc: 0.950819\n",
      "[77]\ttraining's auc: 0.961292\tvalid_1's auc: 0.950821\n",
      "[78]\ttraining's auc: 0.961663\tvalid_1's auc: 0.951294\n",
      "[79]\ttraining's auc: 0.961921\tvalid_1's auc: 0.951446\n",
      "[80]\ttraining's auc: 0.962392\tvalid_1's auc: 0.951912\n",
      "[81]\ttraining's auc: 0.962562\tvalid_1's auc: 0.952056\n",
      "[82]\ttraining's auc: 0.962779\tvalid_1's auc: 0.952163\n",
      "[83]\ttraining's auc: 0.962914\tvalid_1's auc: 0.952218\n",
      "[84]\ttraining's auc: 0.963119\tvalid_1's auc: 0.952386\n",
      "[85]\ttraining's auc: 0.963182\tvalid_1's auc: 0.952501\n",
      "[86]\ttraining's auc: 0.963443\tvalid_1's auc: 0.95256\n",
      "[87]\ttraining's auc: 0.963714\tvalid_1's auc: 0.952695\n",
      "[88]\ttraining's auc: 0.963805\tvalid_1's auc: 0.952723\n",
      "[89]\ttraining's auc: 0.964123\tvalid_1's auc: 0.95302\n",
      "[90]\ttraining's auc: 0.964362\tvalid_1's auc: 0.953185\n",
      "[91]\ttraining's auc: 0.964701\tvalid_1's auc: 0.953451\n",
      "[92]\ttraining's auc: 0.964793\tvalid_1's auc: 0.953465\n",
      "[93]\ttraining's auc: 0.965033\tvalid_1's auc: 0.953724\n",
      "[94]\ttraining's auc: 0.965143\tvalid_1's auc: 0.95381\n",
      "[95]\ttraining's auc: 0.965304\tvalid_1's auc: 0.953962\n",
      "[96]\ttraining's auc: 0.965401\tvalid_1's auc: 0.953958\n",
      "[97]\ttraining's auc: 0.96551\tvalid_1's auc: 0.954081\n",
      "[98]\ttraining's auc: 0.96557\tvalid_1's auc: 0.954114\n",
      "[99]\ttraining's auc: 0.965881\tvalid_1's auc: 0.954475\n",
      "[100]\ttraining's auc: 0.966023\tvalid_1's auc: 0.954552\n",
      "[101]\ttraining's auc: 0.966234\tvalid_1's auc: 0.954831\n",
      "[102]\ttraining's auc: 0.966257\tvalid_1's auc: 0.954867\n",
      "[103]\ttraining's auc: 0.966394\tvalid_1's auc: 0.955067\n",
      "[104]\ttraining's auc: 0.966563\tvalid_1's auc: 0.955287\n",
      "[105]\ttraining's auc: 0.966817\tvalid_1's auc: 0.955574\n",
      "[106]\ttraining's auc: 0.96692\tvalid_1's auc: 0.955644\n",
      "[107]\ttraining's auc: 0.967065\tvalid_1's auc: 0.95584\n",
      "[108]\ttraining's auc: 0.967208\tvalid_1's auc: 0.956014\n",
      "[109]\ttraining's auc: 0.96738\tvalid_1's auc: 0.956099\n",
      "[110]\ttraining's auc: 0.967476\tvalid_1's auc: 0.956252\n",
      "[111]\ttraining's auc: 0.967593\tvalid_1's auc: 0.956256\n",
      "[112]\ttraining's auc: 0.967818\tvalid_1's auc: 0.956287\n",
      "[113]\ttraining's auc: 0.967955\tvalid_1's auc: 0.956404\n",
      "[114]\ttraining's auc: 0.968053\tvalid_1's auc: 0.956522\n",
      "[115]\ttraining's auc: 0.968183\tvalid_1's auc: 0.956619\n",
      "[116]\ttraining's auc: 0.968353\tvalid_1's auc: 0.956735\n",
      "[117]\ttraining's auc: 0.9686\tvalid_1's auc: 0.956898\n",
      "[118]\ttraining's auc: 0.968631\tvalid_1's auc: 0.956914\n",
      "[119]\ttraining's auc: 0.968861\tvalid_1's auc: 0.9571\n",
      "[120]\ttraining's auc: 0.969005\tvalid_1's auc: 0.957162\n",
      "[121]\ttraining's auc: 0.969184\tvalid_1's auc: 0.95718\n",
      "[122]\ttraining's auc: 0.969327\tvalid_1's auc: 0.957312\n",
      "[123]\ttraining's auc: 0.969418\tvalid_1's auc: 0.957383\n",
      "[124]\ttraining's auc: 0.969512\tvalid_1's auc: 0.957437\n",
      "[125]\ttraining's auc: 0.969611\tvalid_1's auc: 0.95743\n",
      "[126]\ttraining's auc: 0.969668\tvalid_1's auc: 0.957437\n",
      "[127]\ttraining's auc: 0.969729\tvalid_1's auc: 0.957552\n",
      "[128]\ttraining's auc: 0.9699\tvalid_1's auc: 0.95769\n",
      "[129]\ttraining's auc: 0.96994\tvalid_1's auc: 0.957687\n",
      "[130]\ttraining's auc: 0.969967\tvalid_1's auc: 0.957734\n",
      "[131]\ttraining's auc: 0.970109\tvalid_1's auc: 0.957851\n",
      "[132]\ttraining's auc: 0.970329\tvalid_1's auc: 0.957977\n",
      "[133]\ttraining's auc: 0.970424\tvalid_1's auc: 0.958063\n",
      "[134]\ttraining's auc: 0.970504\tvalid_1's auc: 0.958191\n",
      "[135]\ttraining's auc: 0.970692\tvalid_1's auc: 0.958313\n",
      "[136]\ttraining's auc: 0.970829\tvalid_1's auc: 0.958427\n",
      "[137]\ttraining's auc: 0.970906\tvalid_1's auc: 0.958428\n",
      "[138]\ttraining's auc: 0.971017\tvalid_1's auc: 0.958404\n",
      "[139]\ttraining's auc: 0.971227\tvalid_1's auc: 0.958641\n",
      "[140]\ttraining's auc: 0.971447\tvalid_1's auc: 0.958804\n",
      "[141]\ttraining's auc: 0.971519\tvalid_1's auc: 0.958883\n",
      "[142]\ttraining's auc: 0.971562\tvalid_1's auc: 0.958931\n",
      "[143]\ttraining's auc: 0.971646\tvalid_1's auc: 0.958971\n",
      "[144]\ttraining's auc: 0.971664\tvalid_1's auc: 0.958959\n",
      "[145]\ttraining's auc: 0.971773\tvalid_1's auc: 0.959017\n",
      "[146]\ttraining's auc: 0.97184\tvalid_1's auc: 0.959066\n",
      "[147]\ttraining's auc: 0.971952\tvalid_1's auc: 0.959156\n",
      "[148]\ttraining's auc: 0.972049\tvalid_1's auc: 0.959231\n",
      "[149]\ttraining's auc: 0.97216\tvalid_1's auc: 0.95927\n",
      "[150]\ttraining's auc: 0.972186\tvalid_1's auc: 0.959273\n",
      "[151]\ttraining's auc: 0.972313\tvalid_1's auc: 0.959377\n",
      "[152]\ttraining's auc: 0.97235\tvalid_1's auc: 0.959422\n",
      "[153]\ttraining's auc: 0.972469\tvalid_1's auc: 0.959509\n",
      "[154]\ttraining's auc: 0.9726\tvalid_1's auc: 0.95949\n",
      "[155]\ttraining's auc: 0.972694\tvalid_1's auc: 0.95956\n",
      "[156]\ttraining's auc: 0.972723\tvalid_1's auc: 0.959566\n",
      "[157]\ttraining's auc: 0.972842\tvalid_1's auc: 0.959722\n",
      "[158]\ttraining's auc: 0.972947\tvalid_1's auc: 0.959757\n",
      "[159]\ttraining's auc: 0.97306\tvalid_1's auc: 0.959744\n",
      "[160]\ttraining's auc: 0.973121\tvalid_1's auc: 0.95979\n",
      "[161]\ttraining's auc: 0.973219\tvalid_1's auc: 0.959827\n",
      "[162]\ttraining's auc: 0.973294\tvalid_1's auc: 0.959879\n",
      "[163]\ttraining's auc: 0.973427\tvalid_1's auc: 0.959925\n",
      "[164]\ttraining's auc: 0.973491\tvalid_1's auc: 0.959971\n",
      "[165]\ttraining's auc: 0.973541\tvalid_1's auc: 0.960009\n",
      "[166]\ttraining's auc: 0.973633\tvalid_1's auc: 0.960034\n",
      "[167]\ttraining's auc: 0.973694\tvalid_1's auc: 0.960062\n",
      "[168]\ttraining's auc: 0.973765\tvalid_1's auc: 0.960061\n",
      "[169]\ttraining's auc: 0.973843\tvalid_1's auc: 0.960098\n",
      "[170]\ttraining's auc: 0.973933\tvalid_1's auc: 0.960049\n",
      "[171]\ttraining's auc: 0.973993\tvalid_1's auc: 0.96009\n",
      "[172]\ttraining's auc: 0.974115\tvalid_1's auc: 0.960142\n",
      "[173]\ttraining's auc: 0.974242\tvalid_1's auc: 0.960123\n",
      "[174]\ttraining's auc: 0.974333\tvalid_1's auc: 0.960153\n",
      "[175]\ttraining's auc: 0.974363\tvalid_1's auc: 0.960169\n",
      "[176]\ttraining's auc: 0.974399\tvalid_1's auc: 0.96017\n",
      "[177]\ttraining's auc: 0.974502\tvalid_1's auc: 0.960263\n",
      "[178]\ttraining's auc: 0.974636\tvalid_1's auc: 0.960331\n",
      "[179]\ttraining's auc: 0.974709\tvalid_1's auc: 0.960367\n",
      "[180]\ttraining's auc: 0.97474\tvalid_1's auc: 0.960326\n",
      "[181]\ttraining's auc: 0.974801\tvalid_1's auc: 0.960366\n",
      "[182]\ttraining's auc: 0.974884\tvalid_1's auc: 0.960406\n",
      "[183]\ttraining's auc: 0.974973\tvalid_1's auc: 0.96045\n",
      "[184]\ttraining's auc: 0.97508\tvalid_1's auc: 0.960432\n",
      "[185]\ttraining's auc: 0.975101\tvalid_1's auc: 0.96043\n",
      "[186]\ttraining's auc: 0.975199\tvalid_1's auc: 0.960488\n",
      "[187]\ttraining's auc: 0.975232\tvalid_1's auc: 0.960468\n",
      "[188]\ttraining's auc: 0.97529\tvalid_1's auc: 0.960557\n",
      "[189]\ttraining's auc: 0.975394\tvalid_1's auc: 0.960638\n",
      "[190]\ttraining's auc: 0.97549\tvalid_1's auc: 0.960698\n",
      "[191]\ttraining's auc: 0.975537\tvalid_1's auc: 0.960712\n",
      "[192]\ttraining's auc: 0.975553\tvalid_1's auc: 0.96069\n",
      "[193]\ttraining's auc: 0.975601\tvalid_1's auc: 0.960705\n",
      "[194]\ttraining's auc: 0.975725\tvalid_1's auc: 0.960782\n",
      "[195]\ttraining's auc: 0.975751\tvalid_1's auc: 0.960775\n",
      "[196]\ttraining's auc: 0.975789\tvalid_1's auc: 0.960812\n",
      "[197]\ttraining's auc: 0.975819\tvalid_1's auc: 0.96085\n",
      "[198]\ttraining's auc: 0.975848\tvalid_1's auc: 0.960844\n",
      "[199]\ttraining's auc: 0.97593\tvalid_1's auc: 0.960896\n",
      "[200]\ttraining's auc: 0.976034\tvalid_1's auc: 0.960992\n",
      "[201]\ttraining's auc: 0.976092\tvalid_1's auc: 0.961009\n",
      "[202]\ttraining's auc: 0.976137\tvalid_1's auc: 0.961062\n",
      "[203]\ttraining's auc: 0.976163\tvalid_1's auc: 0.961095\n",
      "[204]\ttraining's auc: 0.976214\tvalid_1's auc: 0.961112\n",
      "[205]\ttraining's auc: 0.976272\tvalid_1's auc: 0.96117\n",
      "[206]\ttraining's auc: 0.976384\tvalid_1's auc: 0.961271\n",
      "[207]\ttraining's auc: 0.976455\tvalid_1's auc: 0.961288\n",
      "[208]\ttraining's auc: 0.976512\tvalid_1's auc: 0.961247\n",
      "[209]\ttraining's auc: 0.976625\tvalid_1's auc: 0.961213\n",
      "[210]\ttraining's auc: 0.976677\tvalid_1's auc: 0.96123\n",
      "[211]\ttraining's auc: 0.976765\tvalid_1's auc: 0.961283\n",
      "[212]\ttraining's auc: 0.976813\tvalid_1's auc: 0.961255\n",
      "[213]\ttraining's auc: 0.976937\tvalid_1's auc: 0.961381\n",
      "[214]\ttraining's auc: 0.977027\tvalid_1's auc: 0.961453\n",
      "[215]\ttraining's auc: 0.977081\tvalid_1's auc: 0.961532\n",
      "[216]\ttraining's auc: 0.977128\tvalid_1's auc: 0.961596\n",
      "[217]\ttraining's auc: 0.977121\tvalid_1's auc: 0.961623\n",
      "[218]\ttraining's auc: 0.977122\tvalid_1's auc: 0.961632\n",
      "[219]\ttraining's auc: 0.977134\tvalid_1's auc: 0.961595\n",
      "[220]\ttraining's auc: 0.977233\tvalid_1's auc: 0.961667\n",
      "[221]\ttraining's auc: 0.977332\tvalid_1's auc: 0.961689\n",
      "[222]\ttraining's auc: 0.977403\tvalid_1's auc: 0.961739\n",
      "[223]\ttraining's auc: 0.977493\tvalid_1's auc: 0.961815\n",
      "[224]\ttraining's auc: 0.977495\tvalid_1's auc: 0.961794\n",
      "[225]\ttraining's auc: 0.977591\tvalid_1's auc: 0.961792\n",
      "[226]\ttraining's auc: 0.977634\tvalid_1's auc: 0.961832\n",
      "[227]\ttraining's auc: 0.977676\tvalid_1's auc: 0.961877\n",
      "[228]\ttraining's auc: 0.977669\tvalid_1's auc: 0.961893\n",
      "[229]\ttraining's auc: 0.977736\tvalid_1's auc: 0.961921\n",
      "[230]\ttraining's auc: 0.977772\tvalid_1's auc: 0.961927\n",
      "[231]\ttraining's auc: 0.977826\tvalid_1's auc: 0.961961\n",
      "[232]\ttraining's auc: 0.977896\tvalid_1's auc: 0.961967\n",
      "[233]\ttraining's auc: 0.977932\tvalid_1's auc: 0.96201\n",
      "[234]\ttraining's auc: 0.977976\tvalid_1's auc: 0.962047\n",
      "[235]\ttraining's auc: 0.978066\tvalid_1's auc: 0.962059\n",
      "[236]\ttraining's auc: 0.9781\tvalid_1's auc: 0.962096\n",
      "[237]\ttraining's auc: 0.978108\tvalid_1's auc: 0.962073\n",
      "[238]\ttraining's auc: 0.978163\tvalid_1's auc: 0.962079\n",
      "[239]\ttraining's auc: 0.978225\tvalid_1's auc: 0.962067\n",
      "[240]\ttraining's auc: 0.97827\tvalid_1's auc: 0.962073\n",
      "[241]\ttraining's auc: 0.978262\tvalid_1's auc: 0.962057\n",
      "[242]\ttraining's auc: 0.978245\tvalid_1's auc: 0.962086\n",
      "[243]\ttraining's auc: 0.97829\tvalid_1's auc: 0.96201\n",
      "[244]\ttraining's auc: 0.978328\tvalid_1's auc: 0.96198\n",
      "[245]\ttraining's auc: 0.978363\tvalid_1's auc: 0.962012\n",
      "[246]\ttraining's auc: 0.978379\tvalid_1's auc: 0.96203\n",
      "[247]\ttraining's auc: 0.978433\tvalid_1's auc: 0.962045\n",
      "[248]\ttraining's auc: 0.978486\tvalid_1's auc: 0.962034\n",
      "[249]\ttraining's auc: 0.978562\tvalid_1's auc: 0.962079\n",
      "[250]\ttraining's auc: 0.978645\tvalid_1's auc: 0.962083\n",
      "[251]\ttraining's auc: 0.978702\tvalid_1's auc: 0.962148\n",
      "[252]\ttraining's auc: 0.97877\tvalid_1's auc: 0.962164\n",
      "[253]\ttraining's auc: 0.978829\tvalid_1's auc: 0.962204\n",
      "[254]\ttraining's auc: 0.978904\tvalid_1's auc: 0.962285\n",
      "[255]\ttraining's auc: 0.978955\tvalid_1's auc: 0.962298\n",
      "[256]\ttraining's auc: 0.978956\tvalid_1's auc: 0.962275\n",
      "[257]\ttraining's auc: 0.979034\tvalid_1's auc: 0.962338\n",
      "[258]\ttraining's auc: 0.979127\tvalid_1's auc: 0.962398\n",
      "[259]\ttraining's auc: 0.979214\tvalid_1's auc: 0.962441\n",
      "[260]\ttraining's auc: 0.979318\tvalid_1's auc: 0.96247\n",
      "[261]\ttraining's auc: 0.979353\tvalid_1's auc: 0.962443\n",
      "[262]\ttraining's auc: 0.979371\tvalid_1's auc: 0.962427\n",
      "[263]\ttraining's auc: 0.979386\tvalid_1's auc: 0.962424\n",
      "[264]\ttraining's auc: 0.979441\tvalid_1's auc: 0.96243\n",
      "[265]\ttraining's auc: 0.979456\tvalid_1's auc: 0.962421\n",
      "[266]\ttraining's auc: 0.979523\tvalid_1's auc: 0.96239\n",
      "[267]\ttraining's auc: 0.979547\tvalid_1's auc: 0.962404\n",
      "[268]\ttraining's auc: 0.979632\tvalid_1's auc: 0.962468\n",
      "[269]\ttraining's auc: 0.979649\tvalid_1's auc: 0.96247\n",
      "[270]\ttraining's auc: 0.9797\tvalid_1's auc: 0.962472\n",
      "[271]\ttraining's auc: 0.979713\tvalid_1's auc: 0.962469\n",
      "[272]\ttraining's auc: 0.979746\tvalid_1's auc: 0.962497\n",
      "[273]\ttraining's auc: 0.979771\tvalid_1's auc: 0.962459\n",
      "[274]\ttraining's auc: 0.979806\tvalid_1's auc: 0.962468\n",
      "[275]\ttraining's auc: 0.979914\tvalid_1's auc: 0.962506\n",
      "[276]\ttraining's auc: 0.980019\tvalid_1's auc: 0.962522\n",
      "[277]\ttraining's auc: 0.980065\tvalid_1's auc: 0.962515\n",
      "[278]\ttraining's auc: 0.980074\tvalid_1's auc: 0.962511\n",
      "[279]\ttraining's auc: 0.980097\tvalid_1's auc: 0.962538\n",
      "[280]\ttraining's auc: 0.980147\tvalid_1's auc: 0.962604\n",
      "[281]\ttraining's auc: 0.980196\tvalid_1's auc: 0.962664\n",
      "[282]\ttraining's auc: 0.98022\tvalid_1's auc: 0.9627\n",
      "[283]\ttraining's auc: 0.98025\tvalid_1's auc: 0.962705\n",
      "[284]\ttraining's auc: 0.980279\tvalid_1's auc: 0.962741\n",
      "[285]\ttraining's auc: 0.980374\tvalid_1's auc: 0.96277\n",
      "[286]\ttraining's auc: 0.980411\tvalid_1's auc: 0.96279\n",
      "[287]\ttraining's auc: 0.980427\tvalid_1's auc: 0.962805\n",
      "[288]\ttraining's auc: 0.98044\tvalid_1's auc: 0.962839\n",
      "[289]\ttraining's auc: 0.980494\tvalid_1's auc: 0.962859\n",
      "[290]\ttraining's auc: 0.980538\tvalid_1's auc: 0.962898\n",
      "[291]\ttraining's auc: 0.980623\tvalid_1's auc: 0.962917\n",
      "[292]\ttraining's auc: 0.980658\tvalid_1's auc: 0.962918\n",
      "[293]\ttraining's auc: 0.980724\tvalid_1's auc: 0.962978\n",
      "[294]\ttraining's auc: 0.980721\tvalid_1's auc: 0.962997\n",
      "[295]\ttraining's auc: 0.980765\tvalid_1's auc: 0.962941\n",
      "[296]\ttraining's auc: 0.980798\tvalid_1's auc: 0.962989\n",
      "[297]\ttraining's auc: 0.980879\tvalid_1's auc: 0.963094\n",
      "[298]\ttraining's auc: 0.980967\tvalid_1's auc: 0.963186\n",
      "[299]\ttraining's auc: 0.981037\tvalid_1's auc: 0.963121\n",
      "[300]\ttraining's auc: 0.981087\tvalid_1's auc: 0.963145\n",
      "[301]\ttraining's auc: 0.981147\tvalid_1's auc: 0.963184\n",
      "[302]\ttraining's auc: 0.981203\tvalid_1's auc: 0.963224\n",
      "[303]\ttraining's auc: 0.981224\tvalid_1's auc: 0.963188\n",
      "[304]\ttraining's auc: 0.981272\tvalid_1's auc: 0.963195\n",
      "[305]\ttraining's auc: 0.981346\tvalid_1's auc: 0.96323\n",
      "[306]\ttraining's auc: 0.981376\tvalid_1's auc: 0.963233\n",
      "[307]\ttraining's auc: 0.9814\tvalid_1's auc: 0.963277\n",
      "[308]\ttraining's auc: 0.981396\tvalid_1's auc: 0.963256\n",
      "[309]\ttraining's auc: 0.981428\tvalid_1's auc: 0.963322\n",
      "[310]\ttraining's auc: 0.981466\tvalid_1's auc: 0.963328\n",
      "[311]\ttraining's auc: 0.981524\tvalid_1's auc: 0.963384\n",
      "[312]\ttraining's auc: 0.981588\tvalid_1's auc: 0.963451\n",
      "[313]\ttraining's auc: 0.981604\tvalid_1's auc: 0.963469\n",
      "[314]\ttraining's auc: 0.981635\tvalid_1's auc: 0.963462\n",
      "[315]\ttraining's auc: 0.981676\tvalid_1's auc: 0.963453\n",
      "[316]\ttraining's auc: 0.981714\tvalid_1's auc: 0.963481\n",
      "[317]\ttraining's auc: 0.981741\tvalid_1's auc: 0.9635\n",
      "[318]\ttraining's auc: 0.981786\tvalid_1's auc: 0.963518\n",
      "[319]\ttraining's auc: 0.981851\tvalid_1's auc: 0.963563\n",
      "[320]\ttraining's auc: 0.981892\tvalid_1's auc: 0.963554\n",
      "[321]\ttraining's auc: 0.981941\tvalid_1's auc: 0.963606\n",
      "[322]\ttraining's auc: 0.981983\tvalid_1's auc: 0.963629\n",
      "[323]\ttraining's auc: 0.982077\tvalid_1's auc: 0.963642\n",
      "[324]\ttraining's auc: 0.98208\tvalid_1's auc: 0.963639\n",
      "[325]\ttraining's auc: 0.982118\tvalid_1's auc: 0.963613\n",
      "[326]\ttraining's auc: 0.982172\tvalid_1's auc: 0.963635\n",
      "[327]\ttraining's auc: 0.982213\tvalid_1's auc: 0.963671\n",
      "[328]\ttraining's auc: 0.982241\tvalid_1's auc: 0.963719\n",
      "[329]\ttraining's auc: 0.982276\tvalid_1's auc: 0.963724\n",
      "[330]\ttraining's auc: 0.982322\tvalid_1's auc: 0.963764\n",
      "[331]\ttraining's auc: 0.982367\tvalid_1's auc: 0.963806\n",
      "[332]\ttraining's auc: 0.982408\tvalid_1's auc: 0.963849\n",
      "[333]\ttraining's auc: 0.982424\tvalid_1's auc: 0.963875\n",
      "[334]\ttraining's auc: 0.982426\tvalid_1's auc: 0.963884\n",
      "[335]\ttraining's auc: 0.982474\tvalid_1's auc: 0.963917\n",
      "[336]\ttraining's auc: 0.982494\tvalid_1's auc: 0.963951\n",
      "[337]\ttraining's auc: 0.982536\tvalid_1's auc: 0.963938\n",
      "[338]\ttraining's auc: 0.982575\tvalid_1's auc: 0.963954\n",
      "[339]\ttraining's auc: 0.982608\tvalid_1's auc: 0.963971\n",
      "[340]\ttraining's auc: 0.982615\tvalid_1's auc: 0.96397\n",
      "[341]\ttraining's auc: 0.982675\tvalid_1's auc: 0.964018\n",
      "[342]\ttraining's auc: 0.982754\tvalid_1's auc: 0.96404\n",
      "[343]\ttraining's auc: 0.982792\tvalid_1's auc: 0.964007\n",
      "[344]\ttraining's auc: 0.982826\tvalid_1's auc: 0.96402\n",
      "[345]\ttraining's auc: 0.982881\tvalid_1's auc: 0.964031\n",
      "[346]\ttraining's auc: 0.982919\tvalid_1's auc: 0.964047\n",
      "[347]\ttraining's auc: 0.982979\tvalid_1's auc: 0.964125\n",
      "[348]\ttraining's auc: 0.983005\tvalid_1's auc: 0.964135\n",
      "[349]\ttraining's auc: 0.983042\tvalid_1's auc: 0.964109\n",
      "[350]\ttraining's auc: 0.983092\tvalid_1's auc: 0.964122\n",
      "[351]\ttraining's auc: 0.98312\tvalid_1's auc: 0.964171\n",
      "[352]\ttraining's auc: 0.983176\tvalid_1's auc: 0.964203\n",
      "[353]\ttraining's auc: 0.983227\tvalid_1's auc: 0.964223\n",
      "[354]\ttraining's auc: 0.983243\tvalid_1's auc: 0.96425\n",
      "[355]\ttraining's auc: 0.983271\tvalid_1's auc: 0.96428\n",
      "[356]\ttraining's auc: 0.983293\tvalid_1's auc: 0.96429\n",
      "[357]\ttraining's auc: 0.98336\tvalid_1's auc: 0.964288\n",
      "[358]\ttraining's auc: 0.983417\tvalid_1's auc: 0.964298\n",
      "[359]\ttraining's auc: 0.983444\tvalid_1's auc: 0.964281\n",
      "[360]\ttraining's auc: 0.983469\tvalid_1's auc: 0.964353\n",
      "[361]\ttraining's auc: 0.983497\tvalid_1's auc: 0.964365\n",
      "[362]\ttraining's auc: 0.983556\tvalid_1's auc: 0.96436\n",
      "[363]\ttraining's auc: 0.98358\tvalid_1's auc: 0.964343\n",
      "[364]\ttraining's auc: 0.9836\tvalid_1's auc: 0.96429\n",
      "[365]\ttraining's auc: 0.983628\tvalid_1's auc: 0.964283\n",
      "[366]\ttraining's auc: 0.983648\tvalid_1's auc: 0.964254\n",
      "[367]\ttraining's auc: 0.983651\tvalid_1's auc: 0.964263\n",
      "[368]\ttraining's auc: 0.983657\tvalid_1's auc: 0.964262\n",
      "[369]\ttraining's auc: 0.983669\tvalid_1's auc: 0.96425\n",
      "[370]\ttraining's auc: 0.983698\tvalid_1's auc: 0.964266\n",
      "[371]\ttraining's auc: 0.98374\tvalid_1's auc: 0.964294\n",
      "[372]\ttraining's auc: 0.98378\tvalid_1's auc: 0.964308\n",
      "[373]\ttraining's auc: 0.98383\tvalid_1's auc: 0.96426\n",
      "[374]\ttraining's auc: 0.983866\tvalid_1's auc: 0.964248\n",
      "[375]\ttraining's auc: 0.983909\tvalid_1's auc: 0.964274\n",
      "[376]\ttraining's auc: 0.983959\tvalid_1's auc: 0.964289\n",
      "[377]\ttraining's auc: 0.984005\tvalid_1's auc: 0.964264\n",
      "[378]\ttraining's auc: 0.984023\tvalid_1's auc: 0.964264\n",
      "[379]\ttraining's auc: 0.984089\tvalid_1's auc: 0.964246\n",
      "[380]\ttraining's auc: 0.984087\tvalid_1's auc: 0.964172\n",
      "[381]\ttraining's auc: 0.984114\tvalid_1's auc: 0.96416\n",
      "Early stopping, best iteration is:\n",
      "[361]\ttraining's auc: 0.983497\tvalid_1's auc: 0.964365\n",
      "[  1.03838551e-03   1.25994419e-03   6.03770714e-03 ...,   3.32351031e-05\n",
      "   2.16542709e-02   3.63500748e-03]\n",
      "[  3.50655327e-04   3.53286766e-04   2.09851809e-03 ...,   2.62894100e-01\n",
      "   1.40625791e-02   4.58511115e-01]\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/anaconda3/envs/tf/lib/python3.5/site-packages/ipykernel_launcher.py:63: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n"
     ]
    }
   ],
   "source": [
    "train_feat = train.drop(['userid','orderType'],axis=1)\n",
    "trainain_label = train['orderType']\n",
    "\n",
    "\n",
    "test_feat = test.drop(['userid','orderType'],axis=1)\n",
    "test_index = test[['userid']]\n",
    "\n",
    "\n",
    "from  sklearn.model_selection import train_test_split\n",
    "from  sklearn.model_selection import train_test_split\n",
    "train_x,val_x,train_y,val_y = train_test_split(train_feat,trainain_label,test_size=0.3,random_state=1)\n",
    "\n",
    "\n",
    "import lightgbm as lgb \n",
    "# print(type(train_y.values))\n",
    "train_data_1 = lgb.Dataset(train_x,label=train_y,feature_name=list(train_x.columns))\n",
    "\n",
    "val_data_1 = lgb.Dataset(val_x,label=val_y,feature_name=list(val_x.columns),reference=train_data_1)\n",
    "\n",
    "param = {'boosting_type':'gbdt',\n",
    "    'max_depth':4,\n",
    "    'num_leaves':32,\n",
    "    'lambda_l2':1,\n",
    "    'learning_rate':0.1,\n",
    "    'scale_pos_weight':0.16,\n",
    "    'num_threads':40,\n",
    "#     'objective':'regression',\n",
    "    'objective':'binary',\n",
    "    'bagging_fraction':0.8,\n",
    "    'bagging_freq':2,\n",
    "    'seed': 2017,\n",
    "    'min_sum_hessian_in_leaf':3,\n",
    "    'subsample':0.8, \n",
    "     'subsample_freq':2, \n",
    "     'colsample_bytree':0.8, \n",
    "     'reg_alpha':0.2, \n",
    "\n",
    "     'reg_lambda':0.8, \n",
    "                         \n",
    "}\n",
    "\n",
    "\n",
    "# cate_feat = ['roomservice_8','roomservice_4','roomservice_3', 'roomservice_6']\n",
    "# bst = lgb.train(params,lgb_train,num_boost_round=1500,valid_sets=lgb_train,early_stopping_rounds=200,\n",
    "#               categorical_feature=cate_feat)\n",
    "# param['is_unbalance']='true'\n",
    "param['metric'] = 'auc'\n",
    "\n",
    "# 03. cv and train\n",
    "# bst=lgb.cv(param,train_data_1, num_boost_round=1000, nfold=5, early_stopping_rounds=10)\n",
    "# print(len(bst['auc-mean']))\n",
    "# print(bst)\n",
    "# estimators = lgb.train(param,train_data_1,num_boost_round=len(bst['auc-mean']),valid_sets=[train_data_1,val_data_1],early_stopping_rounds=10)\n",
    "\n",
    "estimators = lgb.train(param,train_data_1,num_boost_round=1000,valid_sets=[train_data_1,val_data_1],early_stopping_rounds=20)\n",
    "#04. test predict\n",
    "\n",
    "lgb_val_pred = estimators.predict(val_x)\n",
    "lgb_pred = estimators.predict(test_feat)\n",
    "print(lgb_val_pred)\n",
    "\n",
    "print(lgb_pred)\n",
    "test_index['orderType'] =lgb_pred\n",
    "\n",
    "test_index.to_csv('../result/sumbit_xgb_1.csv',index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "finish\n",
      "1992\n",
      "[  2.12929016e-04   2.61775991e-04   4.03557756e-03 ...,   2.73855136e-01\n",
      "   1.45629791e-02   3.11593231e-01]\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/anaconda3/envs/tf/lib/python3.5/site-packages/ipykernel_launcher.py:77: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n"
     ]
    }
   ],
   "source": [
    "import lightgbm as lgb\n",
    "from sklearn.model_selection import KFold, cross_val_score, train_test_split\n",
    "n_folds = 5\n",
    "def rmsle_cv(train_feat,train_label):\n",
    "    param = {'boosting_type':'gbdt',\n",
    "        'max_depth':3,\n",
    "        'num_leaves':32,\n",
    "        'lambda_l2':1,\n",
    "        'learning_rate':0.03,\n",
    "        'scale_pos_weight':0.16,\n",
    "        'num_threads':40,\n",
    "    #     'objective':'regression',\n",
    "        'objective':'binary',\n",
    "         'metric':'auc',\n",
    "        'bagging_fraction':0.8,\n",
    "        'bagging_freq':2,\n",
    "        'seed': 2017,\n",
    "        'min_sum_hessian_in_leaf':3,\n",
    "        'subsample':0.8, \n",
    "         'subsample_freq':2, \n",
    "         'colsample_bytree':0.8, \n",
    "         'reg_alpha':0.2, \n",
    "\n",
    "         'reg_lambda':0.8, \n",
    "                         \n",
    "    }\n",
    "#     param['is_unbalance']='true'\n",
    "    training_data = lgb.Dataset(train_feat, label=train_label)\n",
    "    num_round = 10000\n",
    "    model = lgb.cv(param, training_data, num_boost_round=num_round, nfold=5, seed=2017,early_stopping_rounds=20)\n",
    "#     print(model)\n",
    "#     print(model['auc-mean'])\n",
    "    best_rounds = np.argmax(model['auc-mean'])\n",
    "    print(best_rounds)\n",
    "\n",
    "    return best_rounds\n",
    "\n",
    "print('finish')\n",
    "param = {'boosting_type':'gbdt',\n",
    "        'max_depth':3,\n",
    "        'num_leaves':32,\n",
    "        'lambda_l2':1,\n",
    "        'learning_rate':0.03,\n",
    "        'scale_pos_weight':0.16,\n",
    "        'num_threads':40,\n",
    "    #     'objective':'regression',\n",
    "        'objective':'binary',\n",
    "         'metric':'auc',\n",
    "        'bagging_fraction':0.8,\n",
    "        'bagging_freq':2,\n",
    "        'seed': 2017,\n",
    "        'min_sum_hessian_in_leaf':3,\n",
    "        'subsample':0.8, \n",
    "         'subsample_freq':2, \n",
    "         'colsample_bytree':0.8, \n",
    "         'reg_alpha':0.2, \n",
    "\n",
    "         'reg_lambda':0.8, \n",
    "                         \n",
    "    }\n",
    "# param['is_unbalance']='true'\n",
    "train_feat = train.drop(['userid','orderType'],axis=1)\n",
    "# train_feat = train_feat.head(10000)\n",
    "train_label = train['orderType']\n",
    "# train_label = train_label.head(10000)\n",
    "\n",
    "\n",
    "\n",
    "test_feat = test.drop(['userid','orderType'],axis=1)\n",
    "test_index = test[['userid']]\n",
    "\n",
    "training_data = lgb.Dataset(train_feat, label=train_label)\n",
    "estimators = lgb.train(param,training_data,num_boost_round=rmsle_cv(train_feat,train_label))\n",
    "lgb_pred = estimators.predict(test_feat)\n",
    "\n",
    "print(lgb_pred)\n",
    "test_index['orderType'] =lgb_pred\n",
    "\n",
    "test_index.to_csv('../result/sumbit_lgb.csv',index=False)\n",
    "# bst = rmsle_cv(bst,train_feat,train_label)\n",
    "# bst.fit(train_feat, train_label)\n",
    "# # pred = bst.predict(test_feat)\n",
    "\n",
    "# pred = bst.predict_proba(test_feat)\n",
    "# print(pred[:,1])\n",
    "# # print(pred)\n",
    "# test_index['orderType'] = pred[:,1]\n",
    "# # test_index['orderType'] = 1-test_index['orderType']\n",
    "# test_index.to_csv('../result/sumbit_xgb_1.csv',index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0]\ttrain-auc:0.777225\teval-auc:0.771994\n",
      "Multiple eval metrics have been passed: 'eval-auc' will be used for early stopping.\n",
      "\n",
      "Will train until eval-auc hasn't improved in 20 rounds.\n",
      "[1]\ttrain-auc:0.834034\teval-auc:0.820159\n",
      "[2]\ttrain-auc:0.83967\teval-auc:0.825565\n",
      "[3]\ttrain-auc:0.848989\teval-auc:0.832756\n",
      "[4]\ttrain-auc:0.855027\teval-auc:0.837524\n",
      "[5]\ttrain-auc:0.861655\teval-auc:0.844941\n",
      "[6]\ttrain-auc:0.860848\teval-auc:0.8443\n",
      "[7]\ttrain-auc:0.873555\teval-auc:0.86019\n",
      "[8]\ttrain-auc:0.873554\teval-auc:0.859947\n",
      "[9]\ttrain-auc:0.873096\teval-auc:0.859623\n",
      "[10]\ttrain-auc:0.873407\teval-auc:0.860462\n",
      "[11]\ttrain-auc:0.885994\teval-auc:0.870548\n",
      "[12]\ttrain-auc:0.885911\teval-auc:0.870291\n",
      "[13]\ttrain-auc:0.885113\teval-auc:0.870184\n",
      "[14]\ttrain-auc:0.886838\teval-auc:0.871625\n",
      "[15]\ttrain-auc:0.893292\teval-auc:0.878629\n",
      "[16]\ttrain-auc:0.893558\teval-auc:0.878883\n",
      "[17]\ttrain-auc:0.896246\teval-auc:0.881254\n",
      "[18]\ttrain-auc:0.896829\teval-auc:0.881791\n",
      "[19]\ttrain-auc:0.898603\teval-auc:0.883278\n",
      "[20]\ttrain-auc:0.898887\teval-auc:0.884087\n",
      "[21]\ttrain-auc:0.898935\teval-auc:0.883974\n",
      "[22]\ttrain-auc:0.900422\teval-auc:0.885763\n",
      "[23]\ttrain-auc:0.900581\teval-auc:0.885859\n",
      "[24]\ttrain-auc:0.901003\teval-auc:0.886416\n",
      "[25]\ttrain-auc:0.905271\teval-auc:0.889052\n",
      "[26]\ttrain-auc:0.908054\teval-auc:0.892371\n",
      "[27]\ttrain-auc:0.909128\teval-auc:0.894236\n",
      "[28]\ttrain-auc:0.911002\teval-auc:0.895921\n",
      "[29]\ttrain-auc:0.91186\teval-auc:0.896722\n",
      "[30]\ttrain-auc:0.912745\teval-auc:0.898347\n",
      "[31]\ttrain-auc:0.913134\teval-auc:0.899731\n",
      "[32]\ttrain-auc:0.916687\teval-auc:0.902905\n",
      "[33]\ttrain-auc:0.91958\teval-auc:0.905344\n",
      "[34]\ttrain-auc:0.921136\teval-auc:0.90717\n",
      "[35]\ttrain-auc:0.92307\teval-auc:0.908792\n",
      "[36]\ttrain-auc:0.924936\teval-auc:0.910529\n",
      "[37]\ttrain-auc:0.927921\teval-auc:0.913321\n",
      "[38]\ttrain-auc:0.928816\teval-auc:0.914113\n",
      "[39]\ttrain-auc:0.93072\teval-auc:0.916066\n",
      "[40]\ttrain-auc:0.931439\teval-auc:0.91668\n",
      "[41]\ttrain-auc:0.932286\teval-auc:0.917401\n",
      "[42]\ttrain-auc:0.932562\teval-auc:0.91782\n",
      "[43]\ttrain-auc:0.934599\teval-auc:0.920288\n",
      "[44]\ttrain-auc:0.936253\teval-auc:0.921771\n",
      "[45]\ttrain-auc:0.937016\teval-auc:0.922363\n",
      "[46]\ttrain-auc:0.938176\teval-auc:0.924014\n",
      "[47]\ttrain-auc:0.940032\teval-auc:0.926384\n",
      "[48]\ttrain-auc:0.940929\teval-auc:0.927286\n",
      "[49]\ttrain-auc:0.941495\teval-auc:0.92787\n",
      "[50]\ttrain-auc:0.942058\teval-auc:0.928577\n",
      "[51]\ttrain-auc:0.943105\teval-auc:0.929809\n",
      "[52]\ttrain-auc:0.944285\teval-auc:0.931307\n",
      "[53]\ttrain-auc:0.944961\teval-auc:0.931889\n",
      "[54]\ttrain-auc:0.946074\teval-auc:0.933458\n",
      "[55]\ttrain-auc:0.946499\teval-auc:0.934088\n",
      "[56]\ttrain-auc:0.946696\teval-auc:0.934278\n",
      "[57]\ttrain-auc:0.947629\teval-auc:0.935364\n",
      "[58]\ttrain-auc:0.94795\teval-auc:0.935777\n",
      "[59]\ttrain-auc:0.948541\teval-auc:0.936526\n",
      "[60]\ttrain-auc:0.948616\teval-auc:0.936682\n",
      "[61]\ttrain-auc:0.949045\teval-auc:0.937212\n",
      "[62]\ttrain-auc:0.94974\teval-auc:0.938065\n",
      "[63]\ttrain-auc:0.950684\teval-auc:0.939528\n",
      "[64]\ttrain-auc:0.95087\teval-auc:0.939917\n",
      "[65]\ttrain-auc:0.951052\teval-auc:0.940126\n",
      "[66]\ttrain-auc:0.951395\teval-auc:0.940481\n",
      "[67]\ttrain-auc:0.952202\teval-auc:0.941603\n",
      "[68]\ttrain-auc:0.95236\teval-auc:0.941807\n",
      "[69]\ttrain-auc:0.952711\teval-auc:0.942004\n",
      "[70]\ttrain-auc:0.95301\teval-auc:0.942361\n",
      "[71]\ttrain-auc:0.953428\teval-auc:0.942746\n",
      "[72]\ttrain-auc:0.953773\teval-auc:0.943134\n",
      "[73]\ttrain-auc:0.95396\teval-auc:0.943106\n",
      "[74]\ttrain-auc:0.954341\teval-auc:0.943541\n",
      "[75]\ttrain-auc:0.954631\teval-auc:0.943831\n",
      "[76]\ttrain-auc:0.954822\teval-auc:0.944089\n",
      "[77]\ttrain-auc:0.955263\teval-auc:0.944779\n",
      "[78]\ttrain-auc:0.955364\teval-auc:0.944883\n",
      "[79]\ttrain-auc:0.955795\teval-auc:0.945445\n",
      "[80]\ttrain-auc:0.956083\teval-auc:0.945901\n",
      "[81]\ttrain-auc:0.956229\teval-auc:0.946017\n",
      "[82]\ttrain-auc:0.956603\teval-auc:0.946521\n",
      "[83]\ttrain-auc:0.957013\teval-auc:0.946869\n",
      "[84]\ttrain-auc:0.957113\teval-auc:0.947094\n",
      "[85]\ttrain-auc:0.957259\teval-auc:0.947305\n",
      "[86]\ttrain-auc:0.9575\teval-auc:0.94751\n",
      "[87]\ttrain-auc:0.957801\teval-auc:0.947742\n",
      "[88]\ttrain-auc:0.958189\teval-auc:0.94818\n",
      "[89]\ttrain-auc:0.958481\teval-auc:0.9483\n",
      "[90]\ttrain-auc:0.958613\teval-auc:0.948485\n",
      "[91]\ttrain-auc:0.958685\teval-auc:0.948529\n",
      "[92]\ttrain-auc:0.958917\teval-auc:0.94875\n",
      "[93]\ttrain-auc:0.95907\teval-auc:0.948779\n",
      "[94]\ttrain-auc:0.959145\teval-auc:0.94883\n",
      "[95]\ttrain-auc:0.959417\teval-auc:0.949019\n",
      "[96]\ttrain-auc:0.959379\teval-auc:0.949003\n",
      "[97]\ttrain-auc:0.959595\teval-auc:0.949267\n",
      "[98]\ttrain-auc:0.959857\teval-auc:0.949449\n",
      "[99]\ttrain-auc:0.960137\teval-auc:0.949803\n",
      "[100]\ttrain-auc:0.96029\teval-auc:0.950007\n",
      "[101]\ttrain-auc:0.960422\teval-auc:0.950097\n",
      "[102]\ttrain-auc:0.96075\teval-auc:0.950413\n",
      "[103]\ttrain-auc:0.96089\teval-auc:0.950498\n",
      "[104]\ttrain-auc:0.961073\teval-auc:0.950756\n",
      "[105]\ttrain-auc:0.961185\teval-auc:0.950874\n",
      "[106]\ttrain-auc:0.961265\teval-auc:0.950957\n",
      "[107]\ttrain-auc:0.96126\teval-auc:0.950896\n",
      "[108]\ttrain-auc:0.961382\teval-auc:0.951024\n",
      "[109]\ttrain-auc:0.961463\teval-auc:0.951111\n",
      "[110]\ttrain-auc:0.961678\teval-auc:0.951231\n",
      "[111]\ttrain-auc:0.96179\teval-auc:0.951326\n",
      "[112]\ttrain-auc:0.961962\teval-auc:0.951412\n",
      "[113]\ttrain-auc:0.962206\teval-auc:0.951679\n",
      "[114]\ttrain-auc:0.96239\teval-auc:0.951889\n",
      "[115]\ttrain-auc:0.962579\teval-auc:0.952081\n",
      "[116]\ttrain-auc:0.962704\teval-auc:0.952284\n",
      "[117]\ttrain-auc:0.962786\teval-auc:0.952281\n",
      "[118]\ttrain-auc:0.962842\teval-auc:0.952398\n",
      "[119]\ttrain-auc:0.96295\teval-auc:0.952487\n",
      "[120]\ttrain-auc:0.963043\teval-auc:0.952649\n",
      "[121]\ttrain-auc:0.963213\teval-auc:0.952864\n",
      "[122]\ttrain-auc:0.963366\teval-auc:0.952922\n",
      "[123]\ttrain-auc:0.963547\teval-auc:0.953079\n",
      "[124]\ttrain-auc:0.963694\teval-auc:0.953169\n",
      "[125]\ttrain-auc:0.963817\teval-auc:0.953274\n",
      "[126]\ttrain-auc:0.96402\teval-auc:0.953425\n",
      "[127]\ttrain-auc:0.964077\teval-auc:0.953483\n",
      "[128]\ttrain-auc:0.964126\teval-auc:0.953564\n",
      "[129]\ttrain-auc:0.964189\teval-auc:0.953662\n",
      "[130]\ttrain-auc:0.964328\teval-auc:0.953709\n",
      "[131]\ttrain-auc:0.964497\teval-auc:0.953865\n",
      "[132]\ttrain-auc:0.964568\teval-auc:0.953972\n",
      "[133]\ttrain-auc:0.964666\teval-auc:0.953988\n",
      "[134]\ttrain-auc:0.964793\teval-auc:0.954103\n",
      "[135]\ttrain-auc:0.964929\teval-auc:0.954197\n",
      "[136]\ttrain-auc:0.964968\teval-auc:0.954244\n",
      "[137]\ttrain-auc:0.965163\teval-auc:0.954367\n",
      "[138]\ttrain-auc:0.965277\teval-auc:0.95445\n",
      "[139]\ttrain-auc:0.965304\teval-auc:0.954493\n",
      "[140]\ttrain-auc:0.965458\teval-auc:0.954632\n",
      "[141]\ttrain-auc:0.965552\teval-auc:0.954698\n",
      "[142]\ttrain-auc:0.965645\teval-auc:0.954824\n",
      "[143]\ttrain-auc:0.965682\teval-auc:0.954749\n",
      "[144]\ttrain-auc:0.965798\teval-auc:0.954798\n",
      "[145]\ttrain-auc:0.965913\teval-auc:0.954937\n",
      "[146]\ttrain-auc:0.965991\teval-auc:0.955103\n",
      "[147]\ttrain-auc:0.966128\teval-auc:0.955142\n",
      "[148]\ttrain-auc:0.966187\teval-auc:0.955155\n",
      "[149]\ttrain-auc:0.966244\teval-auc:0.955252\n",
      "[150]\ttrain-auc:0.966306\teval-auc:0.95528\n",
      "[151]\ttrain-auc:0.966439\teval-auc:0.955408\n",
      "[152]\ttrain-auc:0.966544\teval-auc:0.955486\n",
      "[153]\ttrain-auc:0.966631\teval-auc:0.955528\n",
      "[154]\ttrain-auc:0.966887\teval-auc:0.955752\n",
      "[155]\ttrain-auc:0.967061\teval-auc:0.955904\n",
      "[156]\ttrain-auc:0.967098\teval-auc:0.955956\n",
      "[157]\ttrain-auc:0.967174\teval-auc:0.955965\n",
      "[158]\ttrain-auc:0.967316\teval-auc:0.956113\n",
      "[159]\ttrain-auc:0.967402\teval-auc:0.956204\n",
      "[160]\ttrain-auc:0.967435\teval-auc:0.956231\n",
      "[161]\ttrain-auc:0.967481\teval-auc:0.956253\n",
      "[162]\ttrain-auc:0.967539\teval-auc:0.956298\n",
      "[163]\ttrain-auc:0.96763\teval-auc:0.956397\n",
      "[164]\ttrain-auc:0.967724\teval-auc:0.956471\n",
      "[165]\ttrain-auc:0.967814\teval-auc:0.956526\n",
      "[166]\ttrain-auc:0.967902\teval-auc:0.956557\n",
      "[167]\ttrain-auc:0.968\teval-auc:0.956594\n",
      "[168]\ttrain-auc:0.968112\teval-auc:0.956671\n",
      "[169]\ttrain-auc:0.968244\teval-auc:0.956908\n",
      "[170]\ttrain-auc:0.96832\teval-auc:0.956928\n",
      "[171]\ttrain-auc:0.96844\teval-auc:0.957056\n",
      "[172]\ttrain-auc:0.9685\teval-auc:0.957068\n",
      "[173]\ttrain-auc:0.968578\teval-auc:0.957094\n",
      "[174]\ttrain-auc:0.968647\teval-auc:0.957114\n",
      "[175]\ttrain-auc:0.968715\teval-auc:0.957141\n",
      "[176]\ttrain-auc:0.968792\teval-auc:0.957152\n",
      "[177]\ttrain-auc:0.968853\teval-auc:0.957205\n",
      "[178]\ttrain-auc:0.968988\teval-auc:0.957313\n",
      "[179]\ttrain-auc:0.969019\teval-auc:0.957302\n",
      "[180]\ttrain-auc:0.969144\teval-auc:0.957494\n",
      "[181]\ttrain-auc:0.969221\teval-auc:0.957583\n",
      "[182]\ttrain-auc:0.9693\teval-auc:0.957611\n",
      "[183]\ttrain-auc:0.96936\teval-auc:0.957649\n",
      "[184]\ttrain-auc:0.969446\teval-auc:0.957673\n",
      "[185]\ttrain-auc:0.969484\teval-auc:0.957693\n",
      "[186]\ttrain-auc:0.969581\teval-auc:0.957793\n",
      "[187]\ttrain-auc:0.969639\teval-auc:0.957802\n",
      "[188]\ttrain-auc:0.96971\teval-auc:0.957818\n",
      "[189]\ttrain-auc:0.969728\teval-auc:0.957824\n",
      "[190]\ttrain-auc:0.969823\teval-auc:0.957893\n",
      "[191]\ttrain-auc:0.969906\teval-auc:0.957996\n",
      "[192]\ttrain-auc:0.969931\teval-auc:0.958026\n",
      "[193]\ttrain-auc:0.97001\teval-auc:0.958105\n",
      "[194]\ttrain-auc:0.970074\teval-auc:0.958127\n",
      "[195]\ttrain-auc:0.970168\teval-auc:0.958233\n",
      "[196]\ttrain-auc:0.970216\teval-auc:0.958288\n",
      "[197]\ttrain-auc:0.970273\teval-auc:0.958286\n",
      "[198]\ttrain-auc:0.970279\teval-auc:0.958334\n",
      "[199]\ttrain-auc:0.970317\teval-auc:0.958336\n",
      "[200]\ttrain-auc:0.970416\teval-auc:0.95847\n",
      "[201]\ttrain-auc:0.97055\teval-auc:0.958556\n",
      "[202]\ttrain-auc:0.97057\teval-auc:0.95854\n",
      "[203]\ttrain-auc:0.970631\teval-auc:0.958556\n",
      "[204]\ttrain-auc:0.970675\teval-auc:0.958562\n",
      "[205]\ttrain-auc:0.970762\teval-auc:0.958615\n",
      "[206]\ttrain-auc:0.97082\teval-auc:0.958612\n",
      "[207]\ttrain-auc:0.97087\teval-auc:0.95861\n",
      "[208]\ttrain-auc:0.970906\teval-auc:0.95867\n",
      "[209]\ttrain-auc:0.971005\teval-auc:0.958713\n",
      "[210]\ttrain-auc:0.971089\teval-auc:0.958707\n",
      "[211]\ttrain-auc:0.971173\teval-auc:0.958754\n",
      "[212]\ttrain-auc:0.971218\teval-auc:0.958751\n",
      "[213]\ttrain-auc:0.971281\teval-auc:0.958728\n",
      "[214]\ttrain-auc:0.971354\teval-auc:0.958736\n",
      "[215]\ttrain-auc:0.971427\teval-auc:0.95873\n",
      "[216]\ttrain-auc:0.971461\teval-auc:0.958758\n",
      "[217]\ttrain-auc:0.971508\teval-auc:0.958793\n",
      "[218]\ttrain-auc:0.971566\teval-auc:0.95881\n",
      "[219]\ttrain-auc:0.971641\teval-auc:0.958783\n",
      "[220]\ttrain-auc:0.971756\teval-auc:0.958865\n",
      "[221]\ttrain-auc:0.971828\teval-auc:0.958944\n",
      "[222]\ttrain-auc:0.971901\teval-auc:0.958974\n",
      "[223]\ttrain-auc:0.972025\teval-auc:0.959057\n",
      "[224]\ttrain-auc:0.972096\teval-auc:0.959072\n",
      "[225]\ttrain-auc:0.972155\teval-auc:0.9591\n",
      "[226]\ttrain-auc:0.972183\teval-auc:0.959173\n",
      "[227]\ttrain-auc:0.972226\teval-auc:0.959209\n",
      "[228]\ttrain-auc:0.972334\teval-auc:0.959323\n",
      "[229]\ttrain-auc:0.972399\teval-auc:0.959325\n",
      "[230]\ttrain-auc:0.972473\teval-auc:0.959399\n",
      "[231]\ttrain-auc:0.972477\teval-auc:0.959412\n",
      "[232]\ttrain-auc:0.972502\teval-auc:0.959397\n",
      "[233]\ttrain-auc:0.972575\teval-auc:0.959499\n",
      "[234]\ttrain-auc:0.972616\teval-auc:0.959523\n",
      "[235]\ttrain-auc:0.972707\teval-auc:0.959564\n",
      "[236]\ttrain-auc:0.972789\teval-auc:0.959589\n",
      "[237]\ttrain-auc:0.972825\teval-auc:0.959563\n",
      "[238]\ttrain-auc:0.972875\teval-auc:0.959617\n",
      "[239]\ttrain-auc:0.972899\teval-auc:0.959613\n",
      "[240]\ttrain-auc:0.972934\teval-auc:0.959599\n",
      "[241]\ttrain-auc:0.972979\teval-auc:0.959591\n",
      "[242]\ttrain-auc:0.973037\teval-auc:0.959643\n",
      "[243]\ttrain-auc:0.973094\teval-auc:0.959686\n",
      "[244]\ttrain-auc:0.973119\teval-auc:0.959728\n",
      "[245]\ttrain-auc:0.973187\teval-auc:0.959776\n",
      "[246]\ttrain-auc:0.973268\teval-auc:0.959823\n",
      "[247]\ttrain-auc:0.973319\teval-auc:0.959862\n",
      "[248]\ttrain-auc:0.973376\teval-auc:0.959836\n",
      "[249]\ttrain-auc:0.973409\teval-auc:0.959874\n",
      "[250]\ttrain-auc:0.973414\teval-auc:0.959873\n",
      "[251]\ttrain-auc:0.973441\teval-auc:0.959896\n",
      "[252]\ttrain-auc:0.973482\teval-auc:0.959903\n",
      "[253]\ttrain-auc:0.973532\teval-auc:0.959948\n",
      "[254]\ttrain-auc:0.973594\teval-auc:0.959956\n",
      "[255]\ttrain-auc:0.973648\teval-auc:0.960001\n",
      "[256]\ttrain-auc:0.973716\teval-auc:0.960045\n",
      "[257]\ttrain-auc:0.973787\teval-auc:0.960067\n",
      "[258]\ttrain-auc:0.973884\teval-auc:0.960192\n",
      "[259]\ttrain-auc:0.973931\teval-auc:0.960249\n",
      "[260]\ttrain-auc:0.973992\teval-auc:0.96028\n",
      "[261]\ttrain-auc:0.974015\teval-auc:0.960253\n",
      "[262]\ttrain-auc:0.974084\teval-auc:0.960315\n",
      "[263]\ttrain-auc:0.974149\teval-auc:0.960358\n",
      "[264]\ttrain-auc:0.974234\teval-auc:0.960416\n",
      "[265]\ttrain-auc:0.974287\teval-auc:0.960429\n",
      "[266]\ttrain-auc:0.974328\teval-auc:0.960462\n",
      "[267]\ttrain-auc:0.974392\teval-auc:0.960514\n",
      "[268]\ttrain-auc:0.974426\teval-auc:0.960531\n",
      "[269]\ttrain-auc:0.974486\teval-auc:0.960508\n",
      "[270]\ttrain-auc:0.974517\teval-auc:0.960581\n",
      "[271]\ttrain-auc:0.974558\teval-auc:0.960565\n",
      "[272]\ttrain-auc:0.974602\teval-auc:0.960609\n",
      "[273]\ttrain-auc:0.974642\teval-auc:0.960637\n",
      "[274]\ttrain-auc:0.974696\teval-auc:0.960649\n",
      "[275]\ttrain-auc:0.974762\teval-auc:0.96065\n",
      "[276]\ttrain-auc:0.974771\teval-auc:0.960652\n",
      "[277]\ttrain-auc:0.974795\teval-auc:0.960659\n",
      "[278]\ttrain-auc:0.974826\teval-auc:0.960674\n",
      "[279]\ttrain-auc:0.974911\teval-auc:0.960719\n",
      "[280]\ttrain-auc:0.974955\teval-auc:0.960748\n",
      "[281]\ttrain-auc:0.974968\teval-auc:0.960782\n",
      "[282]\ttrain-auc:0.975003\teval-auc:0.96077\n",
      "[283]\ttrain-auc:0.975079\teval-auc:0.960797\n",
      "[284]\ttrain-auc:0.975127\teval-auc:0.960849\n",
      "[285]\ttrain-auc:0.97521\teval-auc:0.961001\n",
      "[286]\ttrain-auc:0.97524\teval-auc:0.960952\n",
      "[287]\ttrain-auc:0.975287\teval-auc:0.960966\n",
      "[288]\ttrain-auc:0.975343\teval-auc:0.960983\n",
      "[289]\ttrain-auc:0.975383\teval-auc:0.960998\n",
      "[290]\ttrain-auc:0.975416\teval-auc:0.960986\n",
      "[291]\ttrain-auc:0.975427\teval-auc:0.960978\n",
      "[292]\ttrain-auc:0.975454\teval-auc:0.960971\n",
      "[293]\ttrain-auc:0.975494\teval-auc:0.960963\n",
      "[294]\ttrain-auc:0.975531\teval-auc:0.96099\n",
      "[295]\ttrain-auc:0.975571\teval-auc:0.961051\n",
      "[296]\ttrain-auc:0.9756\teval-auc:0.961064\n",
      "[297]\ttrain-auc:0.975619\teval-auc:0.961091\n",
      "[298]\ttrain-auc:0.975635\teval-auc:0.961079\n",
      "[299]\ttrain-auc:0.975666\teval-auc:0.961075\n",
      "[300]\ttrain-auc:0.975736\teval-auc:0.96113\n",
      "[301]\ttrain-auc:0.975787\teval-auc:0.961159\n",
      "[302]\ttrain-auc:0.975862\teval-auc:0.961227\n",
      "[303]\ttrain-auc:0.975917\teval-auc:0.96125\n",
      "[304]\ttrain-auc:0.975937\teval-auc:0.96119\n",
      "[305]\ttrain-auc:0.975966\teval-auc:0.961252\n",
      "[306]\ttrain-auc:0.975981\teval-auc:0.961249\n",
      "[307]\ttrain-auc:0.976002\teval-auc:0.961257\n",
      "[308]\ttrain-auc:0.976067\teval-auc:0.961271\n",
      "[309]\ttrain-auc:0.976087\teval-auc:0.961275\n",
      "[310]\ttrain-auc:0.976132\teval-auc:0.961307\n",
      "[311]\ttrain-auc:0.976173\teval-auc:0.961334\n",
      "[312]\ttrain-auc:0.976199\teval-auc:0.961307\n",
      "[313]\ttrain-auc:0.976223\teval-auc:0.961308\n",
      "[314]\ttrain-auc:0.97631\teval-auc:0.961338\n",
      "[315]\ttrain-auc:0.976418\teval-auc:0.961461\n",
      "[316]\ttrain-auc:0.976431\teval-auc:0.961457\n",
      "[317]\ttrain-auc:0.976485\teval-auc:0.961511\n",
      "[318]\ttrain-auc:0.976514\teval-auc:0.961534\n",
      "[319]\ttrain-auc:0.97656\teval-auc:0.96159\n",
      "[320]\ttrain-auc:0.976619\teval-auc:0.961678\n",
      "[321]\ttrain-auc:0.976649\teval-auc:0.961651\n",
      "[322]\ttrain-auc:0.976688\teval-auc:0.961709\n",
      "[323]\ttrain-auc:0.976738\teval-auc:0.961698\n",
      "[324]\ttrain-auc:0.976773\teval-auc:0.961712\n",
      "[325]\ttrain-auc:0.97681\teval-auc:0.961722\n",
      "[326]\ttrain-auc:0.976916\teval-auc:0.961772\n",
      "[327]\ttrain-auc:0.976977\teval-auc:0.961838\n",
      "[328]\ttrain-auc:0.977009\teval-auc:0.961814\n",
      "[329]\ttrain-auc:0.977057\teval-auc:0.961866\n",
      "[330]\ttrain-auc:0.977099\teval-auc:0.961842\n",
      "[331]\ttrain-auc:0.977125\teval-auc:0.961871\n",
      "[332]\ttrain-auc:0.97715\teval-auc:0.961913\n",
      "[333]\ttrain-auc:0.977203\teval-auc:0.961958\n",
      "[334]\ttrain-auc:0.977232\teval-auc:0.961929\n",
      "[335]\ttrain-auc:0.977285\teval-auc:0.961927\n",
      "[336]\ttrain-auc:0.977355\teval-auc:0.962028\n",
      "[337]\ttrain-auc:0.977421\teval-auc:0.962075\n",
      "[338]\ttrain-auc:0.977447\teval-auc:0.962097\n",
      "[339]\ttrain-auc:0.977494\teval-auc:0.962126\n",
      "[340]\ttrain-auc:0.977514\teval-auc:0.962109\n",
      "[341]\ttrain-auc:0.977551\teval-auc:0.962111\n",
      "[342]\ttrain-auc:0.977585\teval-auc:0.962053\n",
      "[343]\ttrain-auc:0.977608\teval-auc:0.962055\n",
      "[344]\ttrain-auc:0.977629\teval-auc:0.96206\n",
      "[345]\ttrain-auc:0.977641\teval-auc:0.962036\n",
      "[346]\ttrain-auc:0.977656\teval-auc:0.962021\n",
      "[347]\ttrain-auc:0.977718\teval-auc:0.962048\n",
      "[348]\ttrain-auc:0.977741\teval-auc:0.962064\n",
      "[349]\ttrain-auc:0.977789\teval-auc:0.962065\n",
      "[350]\ttrain-auc:0.977861\teval-auc:0.962093\n",
      "[351]\ttrain-auc:0.977899\teval-auc:0.962092\n",
      "[352]\ttrain-auc:0.977942\teval-auc:0.96212\n",
      "[353]\ttrain-auc:0.977998\teval-auc:0.962133\n",
      "[354]\ttrain-auc:0.978025\teval-auc:0.962092\n",
      "[355]\ttrain-auc:0.978082\teval-auc:0.962101\n",
      "[356]\ttrain-auc:0.978111\teval-auc:0.9621\n",
      "[357]\ttrain-auc:0.978143\teval-auc:0.962108\n",
      "[358]\ttrain-auc:0.978125\teval-auc:0.962131\n",
      "[359]\ttrain-auc:0.978168\teval-auc:0.962137\n",
      "[360]\ttrain-auc:0.978201\teval-auc:0.962191\n",
      "[361]\ttrain-auc:0.978238\teval-auc:0.962243\n",
      "[362]\ttrain-auc:0.978268\teval-auc:0.962323\n",
      "[363]\ttrain-auc:0.978272\teval-auc:0.96234\n",
      "[364]\ttrain-auc:0.9783\teval-auc:0.962336\n",
      "[365]\ttrain-auc:0.978328\teval-auc:0.962323\n",
      "[366]\ttrain-auc:0.978343\teval-auc:0.962309\n",
      "[367]\ttrain-auc:0.978394\teval-auc:0.962369\n",
      "[368]\ttrain-auc:0.978411\teval-auc:0.962393\n",
      "[369]\ttrain-auc:0.978477\teval-auc:0.962455\n",
      "[370]\ttrain-auc:0.978505\teval-auc:0.962457\n",
      "[371]\ttrain-auc:0.97851\teval-auc:0.962416\n",
      "[372]\ttrain-auc:0.978548\teval-auc:0.962435\n",
      "[373]\ttrain-auc:0.97859\teval-auc:0.962439\n",
      "[374]\ttrain-auc:0.978595\teval-auc:0.962446\n",
      "[375]\ttrain-auc:0.978631\teval-auc:0.962515\n",
      "[376]\ttrain-auc:0.978717\teval-auc:0.962626\n",
      "[377]\ttrain-auc:0.978744\teval-auc:0.962694\n",
      "[378]\ttrain-auc:0.978759\teval-auc:0.962675\n",
      "[379]\ttrain-auc:0.978783\teval-auc:0.962663\n",
      "[380]\ttrain-auc:0.978836\teval-auc:0.962699\n",
      "[381]\ttrain-auc:0.978882\teval-auc:0.96271\n",
      "[382]\ttrain-auc:0.978922\teval-auc:0.96272\n",
      "[383]\ttrain-auc:0.978962\teval-auc:0.962742\n",
      "[384]\ttrain-auc:0.978989\teval-auc:0.96277\n",
      "[385]\ttrain-auc:0.979048\teval-auc:0.962761\n",
      "[386]\ttrain-auc:0.979071\teval-auc:0.962781\n",
      "[387]\ttrain-auc:0.9791\teval-auc:0.962776\n",
      "[388]\ttrain-auc:0.979139\teval-auc:0.962814\n",
      "[389]\ttrain-auc:0.97916\teval-auc:0.962819\n",
      "[390]\ttrain-auc:0.979176\teval-auc:0.962792\n",
      "[391]\ttrain-auc:0.979198\teval-auc:0.962809\n",
      "[392]\ttrain-auc:0.979231\teval-auc:0.962861\n",
      "[393]\ttrain-auc:0.979301\teval-auc:0.962889\n",
      "[394]\ttrain-auc:0.979325\teval-auc:0.962935\n",
      "[395]\ttrain-auc:0.979369\teval-auc:0.963008\n",
      "[396]\ttrain-auc:0.979385\teval-auc:0.963021\n",
      "[397]\ttrain-auc:0.979399\teval-auc:0.963007\n",
      "[398]\ttrain-auc:0.979435\teval-auc:0.96301\n",
      "[399]\ttrain-auc:0.979457\teval-auc:0.963035\n",
      "[400]\ttrain-auc:0.979479\teval-auc:0.963015\n",
      "[401]\ttrain-auc:0.979518\teval-auc:0.963019\n",
      "[402]\ttrain-auc:0.979543\teval-auc:0.963042\n",
      "[403]\ttrain-auc:0.979588\teval-auc:0.96306\n",
      "[404]\ttrain-auc:0.979622\teval-auc:0.963076\n",
      "[405]\ttrain-auc:0.979656\teval-auc:0.963081\n",
      "[406]\ttrain-auc:0.979709\teval-auc:0.963085\n",
      "[407]\ttrain-auc:0.979737\teval-auc:0.963116\n",
      "[408]\ttrain-auc:0.979765\teval-auc:0.963127\n",
      "[409]\ttrain-auc:0.979797\teval-auc:0.963145\n",
      "[410]\ttrain-auc:0.979843\teval-auc:0.96319\n",
      "[411]\ttrain-auc:0.979891\teval-auc:0.963218\n",
      "[412]\ttrain-auc:0.97991\teval-auc:0.963242\n",
      "[413]\ttrain-auc:0.979941\teval-auc:0.963255\n",
      "[414]\ttrain-auc:0.979979\teval-auc:0.963246\n",
      "[415]\ttrain-auc:0.980021\teval-auc:0.963245\n",
      "[416]\ttrain-auc:0.980077\teval-auc:0.963268\n",
      "[417]\ttrain-auc:0.980129\teval-auc:0.963273\n",
      "[418]\ttrain-auc:0.980137\teval-auc:0.963264\n",
      "[419]\ttrain-auc:0.980152\teval-auc:0.963299\n",
      "[420]\ttrain-auc:0.980191\teval-auc:0.96332\n",
      "[421]\ttrain-auc:0.980216\teval-auc:0.963342\n",
      "[422]\ttrain-auc:0.980267\teval-auc:0.96338\n",
      "[423]\ttrain-auc:0.980294\teval-auc:0.963395\n",
      "[424]\ttrain-auc:0.980322\teval-auc:0.963401\n",
      "[425]\ttrain-auc:0.980371\teval-auc:0.963443\n",
      "[426]\ttrain-auc:0.980389\teval-auc:0.963437\n",
      "[427]\ttrain-auc:0.980428\teval-auc:0.963445\n",
      "[428]\ttrain-auc:0.980448\teval-auc:0.963419\n",
      "[429]\ttrain-auc:0.980503\teval-auc:0.963446\n",
      "[430]\ttrain-auc:0.980527\teval-auc:0.963454\n",
      "[431]\ttrain-auc:0.980556\teval-auc:0.963469\n",
      "[432]\ttrain-auc:0.980585\teval-auc:0.963462\n",
      "[433]\ttrain-auc:0.980594\teval-auc:0.963484\n",
      "[434]\ttrain-auc:0.980611\teval-auc:0.963493\n",
      "[435]\ttrain-auc:0.980662\teval-auc:0.963502\n",
      "[436]\ttrain-auc:0.980674\teval-auc:0.963518\n",
      "[437]\ttrain-auc:0.980738\teval-auc:0.96353\n",
      "[438]\ttrain-auc:0.980764\teval-auc:0.963556\n",
      "[439]\ttrain-auc:0.980804\teval-auc:0.963615\n",
      "[440]\ttrain-auc:0.980843\teval-auc:0.963642\n",
      "[441]\ttrain-auc:0.980856\teval-auc:0.96368\n",
      "[442]\ttrain-auc:0.980907\teval-auc:0.963729\n",
      "[443]\ttrain-auc:0.980932\teval-auc:0.963733\n",
      "[444]\ttrain-auc:0.980952\teval-auc:0.963717\n",
      "[445]\ttrain-auc:0.980969\teval-auc:0.963732\n",
      "[446]\ttrain-auc:0.981002\teval-auc:0.963803\n",
      "[447]\ttrain-auc:0.98104\teval-auc:0.963819\n",
      "[448]\ttrain-auc:0.981074\teval-auc:0.963824\n",
      "[449]\ttrain-auc:0.981101\teval-auc:0.963834\n",
      "[450]\ttrain-auc:0.98114\teval-auc:0.963834\n",
      "[451]\ttrain-auc:0.981154\teval-auc:0.96387\n",
      "[452]\ttrain-auc:0.981195\teval-auc:0.963858\n",
      "[453]\ttrain-auc:0.981214\teval-auc:0.963887\n",
      "[454]\ttrain-auc:0.981264\teval-auc:0.963857\n",
      "[455]\ttrain-auc:0.981297\teval-auc:0.963874\n",
      "[456]\ttrain-auc:0.981317\teval-auc:0.96387\n",
      "[457]\ttrain-auc:0.981333\teval-auc:0.963894\n",
      "[458]\ttrain-auc:0.981346\teval-auc:0.963907\n",
      "[459]\ttrain-auc:0.981361\teval-auc:0.963922\n",
      "[460]\ttrain-auc:0.981375\teval-auc:0.963933\n",
      "[461]\ttrain-auc:0.981385\teval-auc:0.96392\n",
      "[462]\ttrain-auc:0.981414\teval-auc:0.963949\n",
      "[463]\ttrain-auc:0.981438\teval-auc:0.963935\n",
      "[464]\ttrain-auc:0.981482\teval-auc:0.963981\n",
      "[465]\ttrain-auc:0.98151\teval-auc:0.963956\n",
      "[466]\ttrain-auc:0.981546\teval-auc:0.963996\n",
      "[467]\ttrain-auc:0.981574\teval-auc:0.963963\n",
      "[468]\ttrain-auc:0.981583\teval-auc:0.96396\n",
      "[469]\ttrain-auc:0.981641\teval-auc:0.963972\n",
      "[470]\ttrain-auc:0.981675\teval-auc:0.963984\n",
      "[471]\ttrain-auc:0.981722\teval-auc:0.96398\n",
      "[472]\ttrain-auc:0.981751\teval-auc:0.964016\n",
      "[473]\ttrain-auc:0.981786\teval-auc:0.964023\n",
      "[474]\ttrain-auc:0.981798\teval-auc:0.964048\n",
      "[475]\ttrain-auc:0.981817\teval-auc:0.964062\n",
      "[476]\ttrain-auc:0.981844\teval-auc:0.964082\n",
      "[477]\ttrain-auc:0.981881\teval-auc:0.964129\n",
      "[478]\ttrain-auc:0.981891\teval-auc:0.964112\n",
      "[479]\ttrain-auc:0.981916\teval-auc:0.96412\n",
      "[480]\ttrain-auc:0.981942\teval-auc:0.964144\n",
      "[481]\ttrain-auc:0.981959\teval-auc:0.964154\n",
      "[482]\ttrain-auc:0.981981\teval-auc:0.964227\n",
      "[483]\ttrain-auc:0.981989\teval-auc:0.964227\n",
      "[484]\ttrain-auc:0.982001\teval-auc:0.964227\n",
      "[485]\ttrain-auc:0.98202\teval-auc:0.964225\n",
      "[486]\ttrain-auc:0.98203\teval-auc:0.964231\n",
      "[487]\ttrain-auc:0.982059\teval-auc:0.964241\n",
      "[488]\ttrain-auc:0.982093\teval-auc:0.964248\n",
      "[489]\ttrain-auc:0.982118\teval-auc:0.964282\n",
      "[490]\ttrain-auc:0.982145\teval-auc:0.964295\n",
      "[491]\ttrain-auc:0.982167\teval-auc:0.96431\n",
      "[492]\ttrain-auc:0.982171\teval-auc:0.964336\n",
      "[493]\ttrain-auc:0.98219\teval-auc:0.964354\n",
      "[494]\ttrain-auc:0.982232\teval-auc:0.964361\n",
      "[495]\ttrain-auc:0.982237\teval-auc:0.964357\n",
      "[496]\ttrain-auc:0.982262\teval-auc:0.964375\n",
      "[497]\ttrain-auc:0.982313\teval-auc:0.964371\n",
      "[498]\ttrain-auc:0.982322\teval-auc:0.964349\n",
      "[499]\ttrain-auc:0.982357\teval-auc:0.964359\n",
      "[500]\ttrain-auc:0.982399\teval-auc:0.964372\n",
      "[501]\ttrain-auc:0.982428\teval-auc:0.964384\n",
      "[502]\ttrain-auc:0.982459\teval-auc:0.964405\n",
      "[503]\ttrain-auc:0.982465\teval-auc:0.964364\n",
      "[504]\ttrain-auc:0.982477\teval-auc:0.96434\n",
      "[505]\ttrain-auc:0.982491\teval-auc:0.964325\n",
      "[506]\ttrain-auc:0.982531\teval-auc:0.964353\n",
      "[507]\ttrain-auc:0.982575\teval-auc:0.964368\n",
      "[508]\ttrain-auc:0.982589\teval-auc:0.964364\n",
      "[509]\ttrain-auc:0.98261\teval-auc:0.964368\n",
      "[510]\ttrain-auc:0.98263\teval-auc:0.964409\n",
      "[511]\ttrain-auc:0.982645\teval-auc:0.964413\n",
      "[512]\ttrain-auc:0.982689\teval-auc:0.964464\n",
      "[513]\ttrain-auc:0.982698\teval-auc:0.964442\n",
      "[514]\ttrain-auc:0.982708\teval-auc:0.964433\n",
      "[515]\ttrain-auc:0.982729\teval-auc:0.964392\n",
      "[516]\ttrain-auc:0.982739\teval-auc:0.964394\n",
      "[517]\ttrain-auc:0.982745\teval-auc:0.964385\n",
      "[518]\ttrain-auc:0.982778\teval-auc:0.964363\n",
      "[519]\ttrain-auc:0.982771\teval-auc:0.964364\n",
      "[520]\ttrain-auc:0.982794\teval-auc:0.964391\n",
      "[521]\ttrain-auc:0.98281\teval-auc:0.964409\n",
      "[522]\ttrain-auc:0.982828\teval-auc:0.964412\n",
      "[523]\ttrain-auc:0.982854\teval-auc:0.96439\n",
      "[524]\ttrain-auc:0.982879\teval-auc:0.964423\n",
      "[525]\ttrain-auc:0.982887\teval-auc:0.964419\n",
      "[526]\ttrain-auc:0.982932\teval-auc:0.964412\n",
      "[527]\ttrain-auc:0.982952\teval-auc:0.964434\n",
      "[528]\ttrain-auc:0.982962\teval-auc:0.964445\n",
      "[529]\ttrain-auc:0.982967\teval-auc:0.964458\n",
      "[530]\ttrain-auc:0.982987\teval-auc:0.964416\n",
      "[531]\ttrain-auc:0.983003\teval-auc:0.964433\n",
      "[532]\ttrain-auc:0.983032\teval-auc:0.964433\n",
      "Stopping. Best iteration:\n",
      "[512]\ttrain-auc:0.982689\teval-auc:0.964464\n",
      "\n",
      "[  1.40679447e-04   4.28390544e-04   2.77773174e-03 ...,   2.96358615e-01\n",
      "   2.53377389e-02   3.65378886e-01]\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/anaconda3/envs/tf/lib/python3.5/site-packages/ipykernel_launcher.py:60: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n"
     ]
    }
   ],
   "source": [
    "train_feat = train.drop(['userid','orderType'],axis=1)\n",
    "trainain_label = train['orderType']\n",
    "\n",
    "\n",
    "test_feat = test.drop(['userid','orderType'],axis=1)\n",
    "test_index = test[['userid']]\n",
    "\n",
    "\n",
    "from  sklearn.model_selection import train_test_split\n",
    "from  sklearn.model_selection import train_test_split\n",
    "train_x,val_x,train_y,val_y = train_test_split(train_feat,trainain_label,test_size=0.3,random_state=1)\n",
    "\n",
    "\n",
    "\n",
    "import xgboost as xgb\n",
    "dtrain = xgb.DMatrix(train_x,label=train_y)\n",
    "dval = xgb.DMatrix(val_x,val_y)\n",
    "\n",
    "param = {\n",
    "    'max_depth':3, \n",
    "    'learning_rate':0.1,\n",
    "      'n_estimators':10000, \n",
    "      'silent':False, \n",
    "      'objective':'binary:logistic', \n",
    "      'booster':'gbtree', \n",
    "      'n_jobs':10, \n",
    "      'nthread':100, \n",
    "      'gamma':0, \n",
    "      'min_child_weight':1,\n",
    "      'max_delta_step':0, \n",
    "      'subsample':0.8, \n",
    "      'colsample_bytree':0.8, \n",
    "      'colsample_bylevel':0.8, \n",
    "      'reg_alpha':0.2, \n",
    "      'reg_lambda':0.8, \n",
    "      'scale_pos_weight':0.16, \n",
    "      'seed':2017\n",
    "    \n",
    "#     'learning_rate':0.1,\n",
    "#     'n_estimators':1000,\n",
    "#     'max_depth':3,\n",
    "#     'gamma': 0.05,\n",
    "#     'subsample': 0.8,\n",
    "#     'colsample_bytree': 0.8,\n",
    "#     'eta': 0.03,\n",
    "#     'silent': 1,\n",
    "#     'objective':'binary:logistic',\n",
    "#     'scale_pos_weight':1\n",
    "}\n",
    "num_round =5000\n",
    "plst = list(param.items())\n",
    "plst +=[('eval_metric','auc')]\n",
    "evallist = [(dtrain,'train'),(dval,'eval')]\n",
    "\n",
    "bst = xgb.train(plst,dtrain,num_round,evallist,early_stopping_rounds=20)\n",
    "\n",
    "dtest = xgb.DMatrix(test_feat)\n",
    "pred = bst.predict(dtest)\n",
    "print(pred)\n",
    "test_index['orderType'] = pred\n",
    "test_index.to_csv('../result/sumbit_huang.csv',index=False)\n",
    "# param = {'learning_rate' : 0.1,\n",
    "#         'n_estimators': 1000,\n",
    "#         'max_depth': 2,\n",
    "#         'min_child_weight': 3,\n",
    "#         'gamma': 0,\n",
    "#         'subsample': 0.8,\n",
    "#         'colsample_bytree': 0.8,\n",
    "#         'eta': 0.03,\n",
    "#         'silent': 1,\n",
    "#         'objective':\n",
    "# #          'binary:logistic',\n",
    "#         'reg:linear',\n",
    "#         'scale_pos_weight':1}\n",
    "# num_round =150\n",
    "# plst = list(param.items())\n",
    "# plst += [('eval_metric', 'rmse')]\n",
    "# # plst += [('eval_metric', 'logloss')]\n",
    "# evallist = [ (dtrain, 'train'),(dval, 'eval')]\n",
    "# bst=xgb.train(plst,dtrain,num_round,evallist,early_stopping_rounds=30)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "ename": "SyntaxError",
     "evalue": "invalid syntax (<ipython-input-15-18d6194e6424>, line 1)",
     "output_type": "error",
     "traceback": [
      "\u001b[0;36m  File \u001b[0;32m\"<ipython-input-15-18d6194e6424>\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m    [595]\ttrain-auc:0.984376\teval-auc:0.964827\u001b[0m\n\u001b[0m         \t    ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n"
     ]
    }
   ],
   "source": [
    "[595]\ttrain-auc:0.984376\teval-auc:0.964827\n",
    "[596]\ttrain-auc:0.984394\teval-auc:0.964822\n",
    "[597]\ttrain-auc:0.984415\teval-auc:0.964815\n",
    "Stopping. Best iteration:\n",
    "[577]\ttrain-auc:0.983921\teval-auc:0.96486"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "ename": "SyntaxError",
     "evalue": "invalid syntax (<ipython-input-28-603ec2e8c20f>, line 1)",
     "output_type": "error",
     "traceback": [
      "\u001b[0;36m  File \u001b[0;32m\"<ipython-input-28-603ec2e8c20f>\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m    [691]\ttrain-auc:0.980836\teval-auc:0.958503\u001b[0m\n\u001b[0m         \t    ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n"
     ]
    }
   ],
   "source": [
    "[578]\ttrain-auc:0.979151\teval-auc:0.957992\n",
    "[579]\ttrain-auc:0.979187\teval-auc:0.957984\n",
    "[580]\ttrain-auc:0.979219\teval-auc:0.957967\n",
    "Stopping. Best iteration:\n",
    "[560]\ttrain-auc:0.978784\teval-auc:0.958012"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "[771]\ttrain-auc:0.98356\teval-auc:0.959332\n",
    "[772]\ttrain-auc:0.983615\teval-auc:0.959336\n",
    "[773]\ttrain-auc:0.983638\teval-auc:0.959305\n",
    "Stopping. Best iteration:\n",
    "[753]\ttrain-auc:0.983244\teval-auc:0.959378"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "finish\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/anaconda3/envs/tf/lib/python3.5/site-packages/jupyter_client/jsonutil.py:67: DeprecationWarning: Interpreting naive datetime as local 2018-02-04 18:56:56.469957. Please add timezone info to timestamps.\n",
      "  new_obj[k] = extract_dates(v)\n"
     ]
    }
   ],
   "source": [
    "# train = train.head(100)\n",
    "# train_feat = train.drop(['userid','orderType'],axis=1)\n",
    "# trainain_label = train['orderType']\n",
    "# cols = train_feat.columns\n",
    "# test_feat = test.drop(['userid','orderType'],axis=1)\n",
    "# test_index = test[['userid']]\n",
    "# param = {\n",
    "#         'learning_rate':0.1,\n",
    "#         'n_estimators':1000,\n",
    "#         'max_depth':3,\n",
    "#         'gamma': 0,\n",
    "#         'subsample': 0.8,\n",
    "#         'colsample_bytree': 0.8,\n",
    "#         'eta': 0.03,\n",
    "#         'silent': 1,\n",
    "\n",
    "#         'objective':'binary:logistic',\n",
    "#         'scale_pos_weight':0.15,\n",
    "#         'seed':2017\n",
    "#     }\n",
    "import xgboost as xgb\n",
    "def xgb_train_online_find_best_round(bst,train_feat,train_label): \n",
    "    xgb_param = bst.get_xgb_params()  \n",
    "    dtrain = xgb.DMatrix(train_feat,label=train_label)\n",
    "    df = xgb.cv(xgb_param,dtrain,num_boost_round=bst.get_params()['n_estimators'],nfold=5,metrics='auc',early_stopping_rounds=20)\n",
    "    print(df)\n",
    "    nums = np.argmax(df['test-auc-mean'])\n",
    "    bst.set_params(n_estimators=nums)\n",
    "    print(nums)\n",
    "    return bst\n",
    "print('finish')\n",
    "    \n",
    "# plst.set_params(n_estimators=np.argmin(bst['test-auc-mean']))\n",
    "# plst.fit(dtrain[cols], dtrain['orderType'],eval_metric='auc')\n",
    "\n",
    "# dtest = xgb.DMatrix(test_feat)\n",
    "# pred = plst.predict(dtest)\n",
    "# pred_prob = plst.predict_proba(dtest)\n",
    "# print(pred)\n",
    "# print(pred_prob)\n",
    "# xgb_param = alg.get_xgb_params()    \n",
    "# xgtrain = xgb.DMatrix(dtrain[predictors].values, label=dtrain[target].values)    \n",
    "# cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], nfold=cv_folds,       \n",
    "#                   metrics='auc', early_stopping_rounds=early_stopping_rounds, show_progress=False)    \n",
    "# alg.set_params(n_estimators=cvresult.shape[0])#Fit the algorithm on the data\n",
    "# alg.fit(dtrain[predictors], dtrain['Disbursed'],eval_metric='auc')#Predict training set:\n",
    "# dtrain_predictions = alg.predict(dtrain[predictors])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/anaconda3/envs/tf/lib/python3.5/site-packages/jupyter_client/jsonutil.py:67: DeprecationWarning: Interpreting naive datetime as local 2018-02-04 18:56:59.261050. Please add timezone info to timestamps.\n",
      "  new_obj[k] = extract_dates(v)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "     test-auc-mean  test-auc-std  train-auc-mean  train-auc-std\n",
      "0         0.813647      0.001802        0.815155       0.005442\n",
      "1         0.837020      0.014451        0.838013       0.016882\n",
      "2         0.848271      0.012480        0.850950       0.015864\n",
      "3         0.855453      0.011059        0.857961       0.012493\n",
      "4         0.861532      0.008880        0.864685       0.007926\n",
      "5         0.869520      0.009943        0.871678       0.007923\n",
      "6         0.868205      0.009998        0.870872       0.008426\n",
      "7         0.869009      0.009638        0.871634       0.007980\n",
      "8         0.869820      0.009776        0.872209       0.007553\n",
      "9         0.871042      0.009173        0.873710       0.005745\n",
      "10        0.871723      0.008526        0.874478       0.005517\n",
      "11        0.874410      0.009239        0.877042       0.006798\n",
      "12        0.878698      0.010731        0.881424       0.006081\n",
      "13        0.879639      0.010345        0.881951       0.006039\n",
      "14        0.879931      0.010502        0.882481       0.006256\n",
      "15        0.884778      0.012735        0.887753       0.006239\n",
      "16        0.886066      0.013262        0.889012       0.006401\n",
      "17        0.889644      0.007996        0.892964       0.002369\n",
      "18        0.890534      0.007669        0.893772       0.003243\n",
      "19        0.892235      0.008302        0.895596       0.002845\n",
      "20        0.893016      0.008548        0.896426       0.003154\n",
      "21        0.894225      0.007892        0.897544       0.002185\n",
      "22        0.896156      0.007722        0.899644       0.002158\n",
      "23        0.898352      0.007572        0.901585       0.001362\n",
      "24        0.900293      0.007797        0.903723       0.001555\n",
      "25        0.901322      0.008036        0.904600       0.002087\n",
      "26        0.902331      0.008102        0.905453       0.001076\n",
      "27        0.905006      0.007763        0.908272       0.001597\n",
      "28        0.906551      0.007185        0.909746       0.001398\n",
      "29        0.907715      0.006553        0.910677       0.001298\n",
      "..             ...           ...             ...            ...\n",
      "758       0.966085      0.002069        0.985410       0.000111\n",
      "759       0.966093      0.002058        0.985430       0.000115\n",
      "760       0.966096      0.002061        0.985432       0.000114\n",
      "761       0.966087      0.002065        0.985455       0.000120\n",
      "762       0.966083      0.002067        0.985459       0.000115\n",
      "763       0.966080      0.002052        0.985490       0.000119\n",
      "764       0.966073      0.002048        0.985511       0.000120\n",
      "765       0.966090      0.002043        0.985522       0.000123\n",
      "766       0.966082      0.002040        0.985540       0.000124\n",
      "767       0.966080      0.002040        0.985550       0.000121\n",
      "768       0.966079      0.002041        0.985561       0.000120\n",
      "769       0.966083      0.002040        0.985580       0.000121\n",
      "770       0.966083      0.002047        0.985596       0.000121\n",
      "771       0.966094      0.002035        0.985608       0.000126\n",
      "772       0.966099      0.002028        0.985628       0.000130\n",
      "773       0.966094      0.002039        0.985646       0.000133\n",
      "774       0.966091      0.002043        0.985671       0.000123\n",
      "775       0.966102      0.002065        0.985689       0.000119\n",
      "776       0.966114      0.002068        0.985702       0.000124\n",
      "777       0.966111      0.002072        0.985718       0.000119\n",
      "778       0.966112      0.002066        0.985742       0.000121\n",
      "779       0.966111      0.002063        0.985744       0.000120\n",
      "780       0.966113      0.002068        0.985755       0.000124\n",
      "781       0.966114      0.002062        0.985774       0.000116\n",
      "782       0.966118      0.002060        0.985787       0.000116\n",
      "783       0.966127      0.002048        0.985810       0.000116\n",
      "784       0.966132      0.002034        0.985827       0.000119\n",
      "785       0.966129      0.002043        0.985840       0.000111\n",
      "786       0.966145      0.002045        0.985870       0.000105\n",
      "787       0.966151      0.002035        0.985891       0.000110\n",
      "\n",
      "[788 rows x 4 columns]\n",
      "787\n",
      "[  1.78403425e-04   1.42684963e-04   1.88902882e-03 ...,   4.16780382e-01\n",
      "   1.06919520e-02   3.10615391e-01]\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/anaconda3/envs/tf/lib/python3.5/site-packages/ipykernel_launcher.py:31: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n"
     ]
    }
   ],
   "source": [
    "import xgboost as xgb\n",
    "bst=xgb.XGBClassifier(max_depth=3, learning_rate=0.1,\n",
    "              n_estimators=10000, \n",
    "              silent=False, \n",
    "              objective='binary:logistic', \n",
    "              booster='gbtree', \n",
    "              n_jobs=10, \n",
    "              nthread=100, \n",
    "              gamma=0, \n",
    "              min_child_weight=1,\n",
    "              max_delta_step=0, \n",
    "              subsample=0.8, \n",
    "              colsample_bytree=0.8, \n",
    "              colsample_bylevel=0.8, \n",
    "              reg_alpha=0.2, \n",
    "              reg_lambda=0.8, \n",
    "              scale_pos_weight=0.16, \n",
    "              seed=2017)\n",
    "train_feat = train.drop(['userid','orderType'],axis=1)\n",
    "train_label = train['orderType']\n",
    "\n",
    "test_feat = test.drop(['userid','orderType'],axis=1)\n",
    "test_index = test[['userid']]\n",
    "bst = xgb_train_online_find_best_round(bst,train_feat,train_label)\n",
    "bst.fit(train_feat, train_label,eval_metric='auc')\n",
    "# pred = bst.predict(test_feat)\n",
    "# test_index['orderType'] = pred\n",
    "pred = bst.predict_proba(test_feat)\n",
    "print(pred[:,1])\n",
    "# print(pred)\n",
    "test_index['orderType'] = pred[:,1]\n",
    "# test_index['orderType'] = 1-test_index['orderType']\n",
    "test_index.to_csv('../result/sumbit_xgb.csv',index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "df_1 = pd.read_csv('../result/285fe866-728c-4cd7-bd06-e1bc4a9b05fc.csv')\n",
    "df_2 = pd.read_csv('../result/5167716f-08bc-4dd1-a35a-37641120f6f2.csv')\n",
    "df = pd.merge(df_1,df_2,on='userid',how='left')\n",
    "df['orderType'] = df['orderType_x']*0.6 +df['orderType_y']*0.4\n",
    "df = df[['userid','orderType']]\n",
    "df.to_csv('../result/submit_lgb_xgb.csv',index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "508       0.965384      0.002714        0.981107       0.000292\n",
    "509       0.965386      0.002715        0.981122       0.000297\n",
    "510       0.965401      0.002718        0.981143       0.000303\n",
    "511       0.965415      0.002722        0.981154       0.000313"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 164,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[  1.56614275e-04   1.68766332e-04   3.49617447e-03 ...,   3.47843677e-01\n",
      "   1.58925746e-02   3.67879659e-01]\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/anaconda3/lib/python3.6/site-packages/ipykernel/__main__.py:4: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n"
     ]
    }
   ],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "ename": "SyntaxError",
     "evalue": "invalid syntax (<ipython-input-14-86319d2a5692>, line 1)",
     "output_type": "error",
     "traceback": [
      "\u001b[0;36m  File \u001b[0;32m\"<ipython-input-14-86319d2a5692>\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m    598       0.959876      0.002066        0.977435       0.000397\u001b[0m\n\u001b[0m                     ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n"
     ]
    }
   ],
   "source": [
    "815       0.961632      0.002117        0.982757       0.000391\n",
    "816       0.961646      0.002112        0.982778       0.000379\n",
    "817       0.961671      0.002106        0.982788       0.000372\n",
    "818       0.961671      0.002099        0.982805       0.000378\n",
    "819       0.961678      0.002100        0.982820       0.000377"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def get_feat_10(train,n):\n",
    "    dump_path='../cache/get_feat_10_%s_%s_zl_4.csv'%(train,str(n))\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "        df=df[(df['actionType']==1) | (df['actionType']==5) |(df['actionType']==6)|(df['actionType']==7)]    \n",
    "        \n",
    "        df_1 = df[['userid','actionType','actionTime']].groupby(['userid','actionType'],as_index=False).count()\n",
    "        df_1.columns =['userid','actionType','get_feat_10_'+str(n)+'all_nums']  \n",
    "        time_1 = 1505145600 - 3600*n*24\n",
    "        df = df[df['actionTime']>=time_1]\n",
    "        \n",
    "        actions_1 =df[['userid','actionType','actionTime']].groupby(['userid','actionType'],as_index=False).count()\n",
    "        actions_1.columns =['userid','actionType','get_feat_10_'+str(n)+'part_num']  \n",
    "        actions = pd.merge(df_1,actions_1,on=['userid','actionType'],how ='left')\n",
    "        actions['get_feat_10_'+str(n)+'rate'] = actions['get_feat_10_'+str(n)+'part_num'] / actions['get_feat_10_'+str(n)+'all_nums']\n",
    "        del actions['get_feat_10_'+str(n)+'all_nums']\n",
    "        actions = actions.groupby(['userid','actionType']).sum()\n",
    "        \n",
    "        actions = actions.unstack()\n",
    "        columns=[]\n",
    "        for i in actions.columns.levels[0]:\n",
    "            for j in  actions.columns.levels[1]:\n",
    "                columns.append(str(i)+'_'+str(j))\n",
    "        actions.columns = columns\n",
    "        actions = actions.reset_index()\n",
    "        \n",
    "        actions.to_csv(dump_path,index=False)\n",
    "        return actions\n",
    "\n",
    "def get_feat_11(train):\n",
    "    dump_path='../cache/get_feat_11_%s.csv'%(train)\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "        df = df[['userid','actionType']].groupby(['userid'])['actionType'].agg({\n",
    "                                                    'feat_11_last_2':last_2,\n",
    "                                                    'feat_11_last_3':last_3\n",
    "                                                })\n",
    "        df = df.reset_index()\n",
    "        df.to_csv(dump_path,index=False)\n",
    "        return df\n",
    "\n",
    "def get_feat_12(train):\n",
    "    dump_path='../cache/get_feat_12_%s.csv'%(train)\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "        df = df[['userid','actionTime']].groupby(['userid'])['actionTime'].agg({\n",
    "                                                    'feat_12_last_2':last_2,\n",
    "                                                    'feat_12_last_3':last_3\n",
    "                                                })\n",
    "        df = df.reset_index()\n",
    "        df['feat_12_last_2'] = (1505145600-df['feat_12_last_2'])/(3600*24)\n",
    "        df['feat_12_last_3'] = (1505145600-df['feat_12_last_3'])/(3600*24)\n",
    "        df.to_csv(dump_path,index=False)\n",
    "        return df\n",
    "\n",
    "    \n",
    "def get_feat_13(train):\n",
    "    dump_path='../cache/get_feat_13_%s_1.csv'%(train)\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "        df = df[['userid','actionTime']].groupby(['userid'])['actionTime'].agg({'get_feat_13_mean':diff_last_10_mean,\n",
    "                                                                                'get_feat_13_std':diff_last_10_std})                               \n",
    "        df = df.reset_index()                                        \n",
    "\n",
    "        df.to_csv(dump_path,index=False)\n",
    "        return df\n",
    "def get_feat_14(train):\n",
    "    dump_path='../cache/get_feat_14_%s_6.csv'%(train)\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "        df_order = get_orderHistory(train)\n",
    "#         df_order = \n",
    "#         df_order = df_order[df_order['orderType']==0] \n",
    "        df_order = df_order[['userid','orderTime']].drop_duplicates(['userid'],keep='last')\n",
    "#         df_order.columns = ['userid','orderTime_history']\n",
    "        df = pd.merge(df,df_order,on='userid',how='left')\n",
    "        df = df.fillna(1505145600)\n",
    "        df = df[df['actionTime']>df['orderTime']]\n",
    "        \n",
    "        actions_1 = pd.get_dummies(df['actionType'],prefix='actions_14_type')\n",
    "#         print(actions_1)\n",
    "        actions = pd.concat([df[['userid']],actions_1],axis=1)\n",
    "        actions = actions.groupby(['userid'],as_index=False).sum()\n",
    "        actions['actions_14_type']=0\n",
    "        for i in range(1,10,1):\n",
    "            actions['actions_14_type']=actions['actions_14_type']+actions['actions_14_type_'+str(i)]\n",
    "        for i in range(1,10,1):\n",
    "            actions['actions_14_type_rate_'+str(i)]=actions['actions_14_type_'+str(i)]/actions['actions_14_type']\n",
    "            del actions['actions_14_type_'+str(i)]\n",
    "        actions.to_csv(dump_path,index=False)\n",
    "        return actions\n",
    "def get_feat_15(train):\n",
    "    dump_path='../cache/get_feat_15_%s_3.csv'%(train)\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "        df_order = get_orderHistory(train)\n",
    "#         df_order = \n",
    "#         df_order = df_order[df_order['orderType']==0] \n",
    "        df_order = df_order[['userid','orderTime']].drop_duplicates(['userid'],keep='last')\n",
    "#         df_order.columns = ['userid','orderTime_history']\n",
    "        df = pd.merge(df,df_order,on='userid',how='left')\n",
    "        df = df.fillna(1505145600)\n",
    "        df = df[df['actionTime']>df['orderTime']]\n",
    "        \n",
    "        actions = df[['userid','actionTime']].groupby(['userid'])['actionTime'].agg({\n",
    "#                                                                       'feat_15_mean':diff_mean,\n",
    "#                                                                       'feat_15_std':diff_std,\n",
    "# #                                                                       'feat_15_max':diff_max,\n",
    "#                                                                       'feat_15_min':diff_min,\n",
    "                                                                        'feat_15_sum':'sum',\n",
    "#                                                                       'feat_15_last_1':diff_last_1,\n",
    "#                                                                       'feat_3_last_3':diff_last_3\n",
    "                                                                    })\n",
    "        actions = actions.reset_index()\n",
    "        actions.to_csv(dump_path,index=False)\n",
    "        return actions\n",
    "    \n",
    "def get_feat_16(train):\n",
    "    dump_path='../cache/get_feat_16_%s.csv'%(train)\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()\n",
    "        df_order = get_orderHistory(train)\n",
    "#         df_order = \n",
    "        df_order_1 = df_order[df_order['orderType']==1][['userid','orderTime']]\n",
    "        df_order_1.columns =['userid','orderTime_end']\n",
    "#         df_order = df_order[df_order['orderType']==0]\n",
    "        df_order = pd.merge(df_order,df_order_1,on='userid',how='left')\n",
    "        df_order = df_order[df_order['orderTime']<df_order['orderTime_end']]\n",
    "        df_order = df_order[['userid','orderTime','orderTime_end']].drop_duplicates(['userid'],keep='last')\n",
    "#         print(df_order)\n",
    "        \n",
    "        df = pd.merge(df,df_order,on='userid',how='left')\n",
    "        df['orderTime_end'] = df['orderTime_end'].fillna(1505145600)\n",
    "        df['orderTime'] = df['orderTime'].fillna(0)\n",
    "        df = df[(df['actionTime']>df['orderTime']) &(df['actionTime']<df['orderTime_end'])]\n",
    "        \n",
    "#         actions_1 = pd.get_dummies(df['actionType'],prefix='actions_16_type')\n",
    "# #         print(actions_1)\n",
    "#         actions = pd.concat([df[['userid']],actions_1],axis=1)\n",
    "#         actions = actions.groupby(['userid'],as_index=False).sum()\n",
    "#         actions['actions_16_type']=0\n",
    "#         for i in range(1,10,1):\n",
    "#             actions['actions_16_type']=actions['actions_16_type']+actions['actions_16_type_'+str(i)]\n",
    "#         for i in range(1,10,1):\n",
    "#             actions['actions_16_type_rate_'+str(i)]=actions['actions_16_type_'+str(i)]/actions['actions_16_type']\n",
    "#             del actions['actions_16_type_'+str(i)]\n",
    "        actions = df[['userid','actionTime']].groupby(['userid'])['actionTime'].agg({\n",
    "                                                                      'feat_16_mean':diff_mean,\n",
    "                                                                      'feat_16_std':diff_std,\n",
    "                                                                      'feat_16_max':diff_max,\n",
    "                                                                      'feat_16_min':diff_min,\n",
    "                                        \n",
    "#                                                                       'feat_3_last_2':diff_last_2,\n",
    "#                                                                       'feat_3_last_3':diff_last_3\n",
    "                                                                    })\n",
    "        actions = actions.reset_index()\n",
    "#         actions.to_csv(dump_path,index=False)\n",
    "        return actions\n",
    "\n",
    "def get_feat_17(train):\n",
    "    dump_path='../cache/get_feat_17_%s_1.csv'%train\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        df = get_orderHistory(train)\n",
    "        df_1 = df[df['orderType']==0][['userid','orderTime']].groupby(['userid'])['orderTime']\\\n",
    "                                        .agg({\n",
    "                                             'feat_17_mean_0':diff_mean,\n",
    "                                              'feat_17_std_0':diff_std,\n",
    "                                              'feat_17_max_0':diff_max,\n",
    "                                              'feat_17_min_0':diff_min\n",
    "                                        })\n",
    "        df_1 = df_1.reset_index()\n",
    "        \n",
    "        \n",
    "        df_2 = df[df['orderType']==1][['userid','orderTime']].groupby(['userid'])['orderTime']\\\n",
    "                                        .agg({\n",
    "                                             'feat_17_mean_1':diff_mean,\n",
    "                                              'feat_17_std_1':diff_std,\n",
    "                                              'feat_17_max_1':diff_max,\n",
    "                                              'feat_17_min_1':diff_min\n",
    "                                        })\n",
    "        df_2 = df_2.reset_index()\n",
    "        df= df[['userid','orderTime']].groupby(['userid'])['orderTime']\\\n",
    "                                        .agg({\n",
    "                                             'feat_17_mean':diff_mean,\n",
    "                                              'feat_17_std':diff_std,\n",
    "                                              'feat_17_max':diff_max,\n",
    "                                              'feat_17_min':diff_min\n",
    "                                        })\n",
    "        df = df.reset_index()\n",
    "        df = pd.merge(df,df_1,on='userid',how='left')\n",
    "        df = pd.merge(df,df_2,on='userid',how='left')\n",
    "\n",
    "#         df.to_csv(dump_path,index=False)\n",
    "        return df\n",
    "\n",
    "def get_feat_18(train):\n",
    "    dump_path='../cache/get_feat_18_%s.csv'%train\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()    \n",
    "        actions = df.drop_duplicates(['userid','actionType'],keep='last')\n",
    "#         df.columns=['userid','actionType','start_time']\n",
    "        actions = actions[['userid','actionType','actionTime']]\n",
    "        actions['actionTime'] = (1505145600-actions['actionTime'])/(3600*24)\n",
    "#         actions = pd.merge(df,df_1,on=['userid'],how='left')\n",
    "#         actions = actions[actions['actionTime']>actions['start_time']]\n",
    "        actions = actions[['userid','actionType','actionTime']].groupby(['userid','actionType'])['actionTime']\\\n",
    "                    .agg({\n",
    "                       'feat_18_last_1':last_1,\n",
    "                    })\n",
    "        actions = actions.unstack()\n",
    "        columns=[]\n",
    "        for i in actions.columns.levels[0]:\n",
    "            for j in  actions.columns.levels[1]:\n",
    "                columns.append(str(i)+'_'+str(j))\n",
    "        actions.columns = columns\n",
    "        actions = actions.reset_index()\n",
    "        actions.to_csv(dump_path,index=False)\n",
    "        return actions\n",
    "def reverse_index(x):\n",
    "    a = x.tolist()\n",
    "    a.reverse()\n",
    "    a =[0] +a\n",
    "    a =pd.Series(a)\n",
    "    return (a==3).argmax(),(a==2).argmax(),(a==8).argmax(),(a==9).argmax(),(a==4).argmax()\n",
    "#     return (a==1).argmax(),(a==2).argmax(),(a==3).argmax(),(a==4).argmax(),(a==5).argmax(),(a==6).argmax(),(a==7).argmax(),(a==8).argmax(),(a==9).argmax()\n",
    "def get_feat_19(train):\n",
    "    dump_path='../cache/get_feat_19_%s_4.csv'%train\n",
    "    if os.path.exists(dump_path):\n",
    "        actions = pd.read_csv(dump_path)\n",
    "        return actions\n",
    "    else:\n",
    "        if(train=='train'):\n",
    "            df = get_all_train_data()\n",
    "        else:\n",
    "            df = get_all_test_data()    \n",
    "#         actions = df.drop_duplicates(['userid','actionType'],keep='last')\n",
    "#         df.columns=['userid','actionType','start_time']\n",
    "#         actions = df[['userid','actionType']]\n",
    "#         actions['actionTime'] = (1505145600-actions['actionTime'])/(3600*24)\n",
    "#         actions = pd.merge(df,df_1,on=['userid'],how='left')\n",
    "#         actions = actions[actions['actionTime']>actions['start_time']]\n",
    "        df = df[['userid','actionType']].groupby(['userid'])['actionType']\\\n",
    "                    .agg({\n",
    "                       'feat_19_last_1':reverse_index\n",
    "                    })\n",
    "        df = df.reset_index()\n",
    "        ID = df[['userid']]\n",
    "        columns=[]\n",
    "        for i in [2,3,4,8,9]:\n",
    "            columns.append('get_feat_19'+'_'+str(i))\n",
    "        #         actions.columns = columns\n",
    "        #         actions = actions.reset_index()\n",
    "#         print(df.feat_19_last_1)\n",
    "        actions = pd.DataFrame(list(df.feat_19_last_1),columns=columns)\n",
    "        actions = pd.concat([actions,ID],axis=1)\n",
    "#         print(actions)\n",
    "        actions = actions.replace(0,np.nan)\n",
    "        actions.to_csv(dump_path,index=False)\n",
    "        return actions\n",
    "    \n",
    "# def get_feat_24(train):\n",
    "#     dump_path='../cache/get_feat_24_%s_2.csv'%train\n",
    "#     if os.path.exists(dump_path):\n",
    "#         actions = pd.read_csv(dump_path)\n",
    "#         return actions\n",
    "#     else:\n",
    "#         df = get_orderHistory(train)\n",
    "#         df = df[df['orderType']==1]\n",
    "#         actions = df[['userid','orderid']].groupby('userid',as_index=False).count()\n",
    "#         actions.columns =['userid','order_nums']\n",
    "#         for key in ['city','country','continent']:\n",
    "#             df_1 = df[['userid',key]].drop_duplicates(['userid',key],keep='first')\n",
    "#             df_1 = df_1.groupby('userid',as_index=False).count()\n",
    "#             actions = pd.merge(actions,df_1,on='userid',how='left')\n",
    "# #             actions['rate_'+key]=actions[key]/actions['order_nums']\n",
    "#         del actions['order_nums']\n",
    "#         actions.to_csv(dump_path,index=False)\n",
    "#         return actions\n",
    "# def get_feat_25(train):\n",
    "#     dump_path='../cache/get_feat_25_%s_2.csv'%train\n",
    "#     if os.path.exists(dump_path):\n",
    "#         actions = pd.read_csv(dump_path)\n",
    "#         return actions\n",
    "#     else:\n",
    "#         if(train=='train'):\n",
    "#             df = get_all_train_data()\n",
    "#         else:\n",
    "#             df = get_all_test_data()\n",
    "#         df['month'] = df['actionTime'].map(lambda x:datetime.datetime.utcfromtimestamp(x).month())\n",
    "#         actions = df[['userid','month','actionTime']].groupby(['userid','month']).count()\n",
    "    \n",
    "        \n",
    "#         actions = actions.unstack()\n",
    "#         columns=[]\n",
    "#         for i in actions.columns.levels[0]:\n",
    "#             for j in  actions.columns.levels[1]:\n",
    "#                 columns.append(str(i)+'_'+str(j)+\"feat_25\")\n",
    "#         actions.columns = columns\n",
    "        \n",
    "#         actions['feat_25_std'] = actions.apply(lambda x:x.std(),axis=1)\n",
    "        \n",
    "#         actions =actions.reset_index()\n",
    "        \n",
    "        \n",
    "# #         actions_2 = df[['date','userid']].groupby('userid',as_index=False).count()\n",
    "#         actions.to_csv(dump_path,index=False)\n",
    "#         return actions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(486, 2)"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_index[test_index['orderType']>0.8].shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2550.0"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "450/0.15*0.85"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "893       0.957310      0.002719        0.980600       0.000457\n",
    "894       0.957317      0.002724        0.980613       0.000455\n",
    "895       0.957320      0.002712        0.980635       0.000446\n",
    "896       0.957322      0.002705        0.980649       0.000450"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[  6.22697698e-04   2.11691484e-04   5.84542239e-03 ...,   2.17734814e-01\n",
      "   7.19169388e-03   4.77354139e-01]\n"
     ]
    }
   ],
   "source": [
    "pred = bst.predict_proba(test_feat)\n",
    "print(pred[:,1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/anaconda3/lib/python3.6/site-packages/ipykernel/__main__.py:1: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "  if __name__ == '__main__':\n"
     ]
    }
   ],
   "source": [
    "test_index['orderType'] = pred[:,1]\n",
    "# test_index['orderType'] = 1-test_index['orderType']\n",
    "test_index.to_csv('../result/sumbit_xgb.csv',index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "898\n"
     ]
    }
   ],
   "source": [
    "print(nums_round)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [
    {
     "ename": "AttributeError",
     "evalue": "module 'xgboost' has no attribute 'fit'",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mAttributeError\u001b[0m                            Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-33-47c5de55840d>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m     42\u001b[0m \u001b[0;31m# evallist = [(dtrain,'train'),(dval,'eval')]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     43\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 44\u001b[0;31m \u001b[0mbst\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mxgb\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrain_feat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mtrainain_label\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     45\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     46\u001b[0m \u001b[0mdtest\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mxgb\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDMatrix\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtest_feat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mAttributeError\u001b[0m: module 'xgboost' has no attribute 'fit'"
     ]
    }
   ],
   "source": [
    "\n",
    "\n",
    "\n",
    "from  sklearn.model_selection import train_test_split\n",
    "from  sklearn.model_selection import train_test_split\n",
    "# train_x,val_x,train_y,val_y = train_test_split(train_feat,trainain_label,test_size=0.3,random_state=1)\n",
    "\n",
    "\n",
    "\n",
    "import xgboost as xgb\n",
    "XGBClassifier(max_depth=3, learning_rate=0.1,\n",
    "              n_estimators=10000, \n",
    "              silent=True, \n",
    "              objective='binary:logistic', \n",
    "              booster='gbtree', \n",
    "              n_jobs=1, \n",
    "              nthread=None, \n",
    "              gamma=0, \n",
    "              min_child_weight=1,\n",
    "              max_delta_step=0, \n",
    "              subsample=0.8, \n",
    "              colsample_bytree=0.8, \n",
    "              colsample_bylevel=0.8, \n",
    "              reg_alpha=0.2, \n",
    "              reg_lambda=0.8, \n",
    "              scale_pos_weight=0.15, \n",
    "              seed=2017)\n",
    "# dtrain = xgb.DMatrix(train_feat,label=trainain_label)\n",
    "# # dval = xgb.DMatrix(val_x,val_y)\n",
    "# # param = {\n",
    "# #     'learning_rate':0.1,\n",
    "# #     'n_estimators':1000,\n",
    "# #     'max_depth':3,\n",
    "# #     'gamma': 0,\n",
    "# #     'subsample': 0.8,\n",
    "# #     'colsample_bytree': 0.8,\n",
    "# #     'eta': 0.03,\n",
    "# #     'silent': 1,\n",
    "# #     'objective':'binary:logistic',\n",
    "# #     'scale_pos_weight':1\n",
    "# # }\n",
    "# param = {\n",
    "#     'learning_rate':0.1,\n",
    "#     'n_estimators':1000,\n",
    "#     'max_depth':3,\n",
    "#     'gamma': 0,\n",
    "#     'subsample': 0.8,\n",
    "#     'colsample_bytree': 0.8,\n",
    "#     'eta': 0.03,\n",
    "#     'silent': 1,\n",
    "    \n",
    "#     'objective':'binary:logistic',\n",
    "#     'scale_pos_weight':0.15,\n",
    "#     'seed':2017\n",
    "# }\n",
    "# num_round =nums_round\n",
    "# plst = list(param.items())\n",
    "# plst +=[('eval_metric','auc')]\n",
    "# # evallist = [(dtrain,'train'),(dval,'eval')]\n",
    "\n",
    "bst = xgb.fit(train_feat,trainain_label)\n",
    "\n",
    "dtest = xgb.DMatrix(test_feat)\n",
    "pred = bst.predict(dtest)\n",
    "print(pred)\n",
    "\n",
    "# param = {'learning_rate' : 0.1,\n",
    "#         'n_estimators': 1000,\n",
    "#         'max_depth': 2,\n",
    "#         'min_child_weight': 3,\n",
    "#         'gamma': 0,\n",
    "#         'subsample': 0.8,\n",
    "#         'colsample_bytree': 0.8,\n",
    "#         'eta': 0.03,\n",
    "#         'silent': 1,\n",
    "#         'objective':\n",
    "# #          'binary:logistic',\n",
    "#         'reg:linear',\n",
    "#         'scale_pos_weight':1}\n",
    "# num_round =150\n",
    "# plst = list(param.items())\n",
    "# plst += [('eval_metric', 'rmse')]\n",
    "# # plst += [('eval_metric', 'logloss')]\n",
    "# evallist = [ (dtrain, 'train'),(dval, 'eval')]\n",
    "# bst=xgb.train(plst,dtrain,num_round,evallist,early_stopping_rounds=30)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "[464]\ttrain-auc:0.979026\teval-auc:0.953602\n",
    "[465]\ttrain-auc:0.97905\teval-auc:0.953603\n",
    "[466]\ttrain-auc:0.979099\teval-auc:0.953638\n",
    "Stopping. Best iteration:\n",
    "[456]\ttrain-auc:0.978838\teval-auc:0.953689\n",
    "\n",
    "[ 0.00585007  0.00200483  0.02279276 ...,  0.23868018  0.27011889\n",
    "  0.76656681]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "[452]\ttrain-auc:0.978026\teval-auc:0.952813\n",
    "[453]\ttrain-auc:0.978102\teval-auc:0.952918\n",
    "[454]\ttrain-auc:0.978131\teval-auc:0.952934\n",
    "Stopping. Best iteration:\n",
    "[444]\ttrain-auc:0.977673\teval-auc:0.952956\n",
    "\n",
    "[ 0.00398503  0.00202497  0.02204975 ...,  0.21982476  0.18074934\n",
    "  0.60833621]有get_8"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "[392]\ttrain-auc:0.974716\teval-auc:0.952276\n",
    "Stopping. Best iteration:\n",
    "[382]\ttrain-auc:0.974176\teval-auc:0.952313\n",
    "\n",
    "[ 0.00441727  0.00302624  0.04552433 ...,  0.28423321  0.25590533\n",
    "  0.74191785]  无feat_8"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "[293]\ttrain-auc:0.970845\teval-auc:0.950127\n",
    "[294]\ttrain-auc:0.970916\teval-auc:0.950105\n",
    "Stopping. Best iteration:\n",
    "[284]\ttrain-auc:0.970278\teval-auc:0.95014   有get_8"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "[572]\ttrain-auc:0.982629\teval-auc:0.954046\n",
    "[573]\ttrain-auc:0.982681\teval-auc:0.954\n",
    "Stopping. Best iteration:\n",
    "[553]\ttrain-auc:0.982046\teval-auc:0.954122\n",
    "\n",
    "[ 0.00339986  0.00187712  0.01689197 ...,  0.26064363  0.14851223\n",
    "  0.68210089]  #0.95X    第三好"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.08465660976578007\n",
      "finish\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/anaconda3/lib/python3.6/site-packages/ipykernel/__main__.py:1: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "  if __name__ == '__main__':\n",
      "/usr/local/anaconda3/lib/python3.6/site-packages/ipykernel/__main__.py:4: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n"
     ]
    }
   ],
   "source": [
    "test_index['orderType'] = pred\n",
    "# test_index['orderType'] = 1-test_index['orderType']\n",
    "test_index.to_csv('../result/sumbit_xgb.csv',index=False)\n",
    "test_index['orderType']=test_index['orderType'].map(lambda x:1 if x>0.55 else 0)\n",
    "print(test_index['orderType'].mean())\n",
    "# print(pred.mean())\n",
    "test_index.to_csv('../result/sumbit_xgb_int.csv',index=False)\n",
    "print(\"finish\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "[580]\ttrain-auc:0.98211\teval-auc:0.954075\n",
    "[581]\ttrain-auc:0.982125\teval-auc:0.954037\n",
    "[582]\ttrain-auc:0.982141\teval-auc:0.954003\n",
    "[583]\ttrain-auc:0.982159\teval-auc:0.954003\n",
    "Stopping. Best iteration:\n",
    "[563]\ttrain-auc:0.981465\teval-auc:0.954155\n",
    "\n",
    "[ 0.00417248  0.00107651  0.03718909 ...,  0.24589968  0.2446343\n",
    "  0.70949179]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "530]\ttrain-auc:0.980583\teval-auc:0.953265\n",
    "[531]\ttrain-auc:0.980624\teval-auc:0.953293\n",
    "[532]\ttrain-auc:0.98067\teval-auc:0.953332\n",
    "[533]\ttrain-auc:0.980706\teval-auc:0.95334\n",
    "[534]\ttrain-auc:0.980776\teval-auc:0.95334\n",
    "Stopping. Best iteration:\n",
    "[514]\ttrain-auc:0.980067\teval-auc:0.953344\n",
    "\n",
    "[ 0.00380366  0.00295744  0.04816294 ...,  0.24471869  0.27664843\n",
    "  0.73727888]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "[544]\ttrain-auc:0.98146\teval-auc:0.953374\n",
    "[545]\ttrain-auc:0.981506\teval-auc:0.953382\n",
    "[546]\ttrain-auc:0.981529\teval-auc:0.953404\n",
    "Stopping. Best iteration:\n",
    "[526]\ttrain-auc:0.980849\teval-auc:0.953468\n",
    "\n",
    "[ 0.00334145  0.00182173  0.02016011 ...,  0.48006392  0.0438972\n",
    "  0.62480545]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "[673]\ttrain-auc:0.985026\teval-auc:0.954329\n",
    "[674]\ttrain-auc:0.98505\teval-auc:0.954334\n",
    "[675]\ttrain-auc:0.985079\teval-auc:0.954317\n",
    "[676]\ttrain-auc:0.985119\teval-auc:0.954372\n",
    "Stopping. Best iteration:\n",
    "[656]\ttrain-auc:0.984688\teval-auc:0.954406\n",
    "        [ 0.00234315  0.00173575  0.01657015 ...,  0.39566973  0.01022997\n",
    "  0.82710207]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "[527]\ttrain-auc:0.976992\teval-auc:0.951358\n",
    "[528]\ttrain-auc:0.977032\teval-auc:0.951359\n",
    "[529]\ttrain-auc:0.977052\teval-auc:0.951381\n",
    "[530]\ttrain-auc:0.97709\teval-auc:0.951433\n",
    "Stopping. Best iteration:\n",
    "[510]\ttrain-auc:0.976439\teval-auc:0.95151\n",
    "\n",
    "[ 0.01809444  0.00549236  0.02082038 ...,  0.38132155  0.03133645\n",
    "  0.68684578]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 0.0438631   0.00727773  0.00708104  0.00236035  0.00354052  0.00550747\n",
      "  0.02793076  0.02065303  0.01553895  0.01239182  0.00983478  0.01062156\n",
      "  0.00314713  0.00216365  0.00275374  0.00393391  0.004524    0.00944139\n",
      "  0.00472069  0.00177026  0.          0.00531078  0.01258851  0.00373721\n",
      "  0.00472069  0.01475216  0.01278521  0.02045633  0.00570417  0.00354052\n",
      "  0.00255704  0.01239182  0.01003147  0.0088513   0.05310779  0.03599528\n",
      "  0.0220299   0.01573564  0.0131786   0.01671912  0.00944139  0.01101495\n",
      "  0.0129819   0.0129819   0.01278521  0.02084973  0.0218332   0.03402833\n",
      "  0.02124312  0.004524    0.01062156  0.00393391  0.01612903  0.03048781\n",
      "  0.01160504  0.03166798  0.00786782  0.00511408  0.01907947  0.00491739\n",
      "  0.01199843  0.00295043  0.03048781  0.00924469  0.03048781  0.00354052\n",
      "  0.00137687  0.00275374  0.00747443  0.00098348  0.00845791  0.00708104\n",
      "  0.00708104  0.00491739  0.00629426  0.00609756  0.00786782  0.00511408\n",
      "  0.01022817  0.00334382  0.00413061  0.00472069  0.00236035  0.00944139\n",
      "  0.00747443  0.01140834  0.00531078  0.00275374  0.004524    0.00373721]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fa203af9278>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n3ruEOXdU1bEjdUzjLq6q5y3S521V9bmq6sXOUVVnVtWrRusAAACAA3XYBApJLk1ydnefPzhuLsmC\ngUKSJ5L8+yRX7EddIy5OsmCgkOT2JD+Q5O+XMN+ZSQQKAAAAPO0Oi0Chqq5L8uIkN1fVlVV1Q1Xd\nUVV3V9Ubpj5zVXVbVd01vXZfaG9KckZVbamqy/c2f3d/tbv/MrNgYbS2P6qqO6tqe1VdMrUdUVUf\nqqp7q2pbVV1eVW9Ksj7JjVMtz9xHLXd3944lnHcuyVuSXD7Nd0ZV3V9Vz5g+f/bu46q6tap+fep3\nb1WdPvU5Zm+/y32c75Kq2lxVm3c9vnPwtwQAAMBKs2a5C1iK7n5LVb0uyVlJfjrJJ7r7J6rqOUnu\nqKq/SPJIZisYnqiqE5L8fmYX8BuTXNHdP3yIyvuJ7v7vU0Dw11X1nzNbFXFcd5+UJFX1nO7+/6rq\nbVMtmw/0pN29YwpaHuvuX53Oc2uSDUn+KMm/SfKR7v6nqkqSo7v7lKr63iQ3JDkpyZXZy++yu7+6\nl/Ndn+T6JDly3Ql9oPUDAABweDssVijs4TVJNlbVliS3JjkqyQuSPCPJb1XVtiR/kOQlT1M9l1XV\nPUk+leT5SU5I8oUkL66q/zQFIV9+mmr5QJIfn37+8SQfnPfZ7ydJd//fSZ49BQj7+l0CAADAgg6L\nFQp7qCTndvdnn9JYdVWSLyZ5WWZByfDtC8OFVJ2Z2X4H/6q7H59WCBzV3f9QVS9L8trMbkv4sSQ/\ncajr6e7bp1s/zkxyRHffO//jPbtnH79LAAAAWMzhuELhliRvr2kdf1WdOrWvTfJwdz+Z5IIkR0zt\nX0nyrENUy9ok/zCFCScm+e6ppmOT/LPu/s9Jfi7JaYeolr3N99tJfi9PXZ2QJG+eavueJDu7e2f2\n/bsEAACABR2OgcI7M7u9YWtVbZ+Ok+R9SS6abj84McnufQC2JtlVVffsa1PGZPYoyCT/McnFVfVA\nVS3llok/S7Kmqu7LbPPHT03txyW5dbqV4HeT/OzU/qEk1y20KeP0eMwHkhw/fccPLHD+P0lyzu5N\nGae2G5P880y3OMzzRFXdneS6JP/r1Lav3yUAAAAsqLrtr7eSTE+TeEN3XzCv7dYcpM0gk9mmjOsu\nes/BmAoAAL5h7di0YblLgGVRVXd29/rF+h2OeyiwD1X1n5L8YJIfWu5aAAAAWNlWVaBQVa9Ncs0e\n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\nAIBhAgUAAABgmEABAAAAGCZQAAAAAIYJFAAAAIBhAgUAAABgmEABAAAAGCZQAAAAAIYJFAAAAIBh\nAgUAAABgmEABAAAAGCZQAAAAAIYJFAAAAIBhAgUAAABgmEABAAAAGCZQAAAAAIYJFAAAAIBhAgUA\nAABgmEABAAAAGCZQAAAAAIatWe4COPxse3Bn5jbetNxlAACHyI5NG5a7BAAOA1YoAAAAAMMECgAA\nAMAwgQIAAAAwTKAAAAAADBMoAAAAAMMECgAAAMAwgQIAAAAwTKAAAAAADBMoAAAAAMMECgAAAMAw\ngQIAAAAwTKAAAAAADFuRgUJVXVZV91XVjYPj5qrqvEX6nF1Vd1bVtun9++Z99vKp/XNVdW1V1f5+\nh6dDVZ1ZVTurasv0+vnlrgkAAIDDw5rlLuAQuTTJD3T3A4Pj5pKcl+T3FujzaJIf6e6HquqkJLck\nOW767P1JfjLJp5P8lySvS3LzYA1Pt9u6+4eXuwgAAAAOLytuhUJVXZfkxUlurqorq+qGqrqjqu6u\nqjdMfeaq6raqumt6vWoavinJGdNf6y/f2/zdfXd3PzQdbk/yzKo6sqrWJXl2d3+quzvJbyd54wJ1\n3lpV766qzdNqildU1Ueq6u+q6up5/f7tVP+WqvrNqjpian//NHZ7Vf3ivP47quoXp++1rapO3O9f\nJgAAAOzDigsUuvstSR5KclaSY5J8ortPn47fVVXHJHkkydndfVqSNye5dhq+MbO/2J/S3e9ewunO\nTXJXd38ts1UK81dEPJD/uXJhX/6xu9cnuS7Jx5K8NclJSS6uqudW1XdO9b26u09JsivJ+dPYK6ex\n35XkX1fVd82b99Hpu70/yRWL1PCvquqeqrq5ql66r05VdckUYGze9fjORaYEAABgpVuptzzs9pok\nr6+q3RfVRyV5QWaBw3uravdF+neMTjxdfF8znWN//fH0vi3J9u5+eJr7C0men+R7krw8yV9P2zE8\nM7MwJEl+rKouyezfcF2SlyTZOn32ken9ziQ/usD570rywu5+rKp+KMkfJTlhbx27+/ok1yfJketO\n6LGvCQAAwEqz0gOFSnJud3/2KY1VVyX5YpKXZbZK44mhSauOT/LRJBd29+en5geTHD+v2/FT20K+\nNr0/Oe/n3cdrpvo/3N0/u8f5X5TZyoNXdPc/VNWHMgtL9px3Vxb4N+7uL8/7+b9U1fuq6tjufnSR\nugEAAFjlVtwtD3u4Jcnbdz9toapOndrXJnm4u59MckGSI6b2ryR51kITVtVzktyUZGN33767fVpd\n8OWq+u7pfBdmdhvDgfh4kjdV1bdO5/7mqnphkmcn+WqSnVX1bUl+cH8mr6p/Me93c3pm/x++dIA1\nAwAAsAqs9EDhnUmekWRrVW2fjpPkfUkuqqp7kpyY2cV5MrtlYNe0p8BeN2VM8rYk357k5+c9bvFb\np88uTfKBJJ9L8vkc4BMeuvtvkvxckv9aVVuT/HmSdd19T5K7k3wmsydS3L7vWRb0piT3Tr+Ha5P8\nm2lDSQAAAFhQuX5k1JHrTuh1F71nucsAAA6RHZs2LHcJACyjqrpzegjAglb6CgUAAADgEFjpmzLu\nt6p6bWZPcZjv/u4+Z3Ce30jy6j2af727P3gg9Q3W8ONJfmqP5tu7+61PVw0AAACsLAKFfejuWzLb\n1PFA51n2i/YpvHjaAgwAAABWPrc8AAAAAMMECgAAAMAwgQIAAAAwTKAAAAAADBMoAAAAAMMECgAA\nAMAwj41k2MnHrc3mTRuWuwwAAACWkRUKAAAAwDCBAgAAADBMoAAAAAAMEygAAAAAwwQKAAAAwDCB\nAgAAADBMoAAAAAAMEygAAAAAwwQKAAAAwDCBAgAAADBMoAAAAAAMEygAAAAAwwQKAAAAwDCBAgAA\nADBMoAAAAAAMEygAAAAAwwQKAAAAwDCBAgAAADBMoAAAAAAMEygAAAAAwwQKAAAAwDCBAgAAADBM\noAAAAAAMEygAAAAAwwQKAAAAwDCBAgAAADBMoAAAAAAMEygAAAAAwwQKAAAAwLA1y10Ah59tD+7M\n3MablrsMAGCeHZs2LHcJAKwyVigAAAAAwwQKAAAAwDCBAgAAADBMoAAAAAAMEygAAAAAwwQKAAAA\nwDCBAgAAADBMoAAAAAAMEygAAAAAwwQKAAAAwDCBAgAAADBMoAAAAAAMW5GBQlVdVlX3VdWNg+Pm\nquq8RfqcXVV3VtW26f375n328qn9c1V1bVXV/n6Hp0NVnVhV/09Vfa2qrljuegAAADh8rMhAIcml\nSc7u7vMHx80lWTBQSPJokh/p7pOTXJTkd+Z99v4kP5nkhOn1usHzP93+e5LLkvzqchcCAADA4WXF\nBQpVdV2SFye5uaqurKobquqOqrq7qt4w9Zmrqtuq6q7p9app+KYkZ1TVlqq6fG/zd/fd3f3QdLg9\nyTOr6siqWpfk2d39qe7uJL+d5I0L1HlrVb27qjZPqyleUVUfqaq/q6qr5/X7t1P9W6rqN6vqiKn9\n/dPY7VX1i/P676iqX5y+17aqOnFfNXT3I93910n+aQm/10um823e9fjOxboDAACwwq24QKG735Lk\noSRnJTkmySe6+/Tp+F1VdUySRzJbwXBakjcnuXYavjHJbd19Sne/ewmnOzfJXd39tSTHJXlg3mcP\nTG0L+cfuXp/kuiQfS/LWJCclubiqnltV3znV9+ruPiXJriS7V11cOY39riT/uqq+a968j07f7f1J\nDsqtDN19fXev7+71Rxy99mBMCQAAwGFszXIXcIi9Jsnr5+0PcFSSF2QWOLy3qnZfpH/H6MRV9dIk\n10zn2F9/PL1vS7K9ux+e5v5Ckucn+Z4kL0/y19N2DM/MLAxJkh+rqksy+zdcl+QlSbZOn31ker8z\nyY8eQH0AAACwVys9UKgk53b3Z5/SWHVVki8meVlmqzSeGJq06vgkH01yYXd/fmp+MMnx87odP7Ut\n5GvT+5Pzft59vGaq/8Pd/bN7nP9Fma08eEV3/0NVfSizsGTPeXdl5f8bAwAAsAxW3C0Pe7glydt3\nP22hqk6d2tcmebi7n0xyQZIjpvavJHnWQhNW1XOS3JRkY3ffvrt9Wl3w5ar67ul8F2Z2G8OB+HiS\nN1XVt07n/uaqemGSZyf5apKdVfVtSX7wAM8DAAAAQ1Z6oPDOJM9IsrWqtk/HSfK+JBdV1T1JTszs\n4jyZ3TKwq6ru2demjEneluTbk/z8tFHilt0X/Jk9XeIDST6X5PNJbj6Q4rv7b5L8XJL/WlVbk/x5\nknXdfU+Su5N8JsnvJbl937PsW1X9i6p6IMlPJ/m5qnqgqp59IDUDAACwOtTsgQSwdEeuO6HXXfSe\n5S4DAJhnx6YNy10CACtEVd05PQRgQSt9hQIAAABwCNiwbx+q6rWZPcVhvvu7+5zBeX4jyav3aP71\n7v7ggdQ3WMOPJ/mpPZpv7+63Pl01AAAAsLIIFPahu2/JbFPHA51n2S/ap/DiaQswAAAAWPnc8gAA\nAAAMEygAAAAAwwQKAAAAwDCBAgAAADBMoAAAAAAM85QHhp183Nps3rRhucsAAABgGVmhAAAAAAwT\nKAAAAADDBAoAAADAMIECAAAAMEygAAAAAAwTKAAAAADDBAoAAADAMIECAAAAMEygAAAAAAwTKAAA\n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\n8rldXVVXVtXHkryxqk6pqo9U1S1V9eGq+jdV9a1JXpfkzKmmM6vq6Kp623T/t1TVC5f4+7woyY4k\ndyzS59yq2lZV23Z9/Z7FhgMAAGANOFQzFF7e3d+b2ZfxV1bVdyX5jSQv7u6Tkryku3cmuTLJZd29\nqbtv2muM30rymu5+SpLtSX5pznvruvuUJK+a035ekl/r7k3TdT+/VJFTqHFyko/N9353vyvJtiQv\nm8b9kyQn7AkLkvx4krdNx0cn2dbdT0ry53PquirJ+dPncUGSty5R1mOSnNrdP53k00lO6+6Tk/xi\nkjd09z9Ox++cPrd3JrkoyQenz+SZSd5UVUcvcM/HJHlNktcuVkR3X9Xdm7t78xEPX79EyQAAABzu\nFptGfyC9sqpOn46/O8m5Sf6iu3ckSXf/w2InV9X6JI/s7j+fmt6R5No5Xd49/b45ycbp+CNJLqqq\nxyR5d3f/9RLXOCbJ7yd5VXd/bTk31d1dVb+d5N9X1duTfH+SPXs+7E7yzun4d5K8e7rGqUmurao9\nwxy1xGWu7e5d0/H6JO+YZlt0kiMXOOe5SV4wZz+EhyU5LrPZF3u7OLMQ5745NQEAAMCiDnqgUFXP\nSPLsJN/f3V+vqhuT3Jpkwan+++Ab0+9dme6pu393WiqwJcmfVNV/7O4PLlDjkZmFCdd097vn67OI\ntyf5oyQPZPbl/58W6NeZzQj56jS7Ybnun3N8SZIbuvv0aTbFjQucU5nN/vjMMsZ/WpIzquqNSR6Z\nZHdVPdDdVwzUCAAAwBpzKJY8rE/ylSlMOCGzjQ8fluQHq+qxSVJV3z71vTfJI/YeoLvvSfKVPfsj\nJDkrs2UEC6qqxyX5XHe/JckfJHnKAv0qyW8mubO737yM+3lQjd39xSRfTPILmYULe3xLkjOm45cm\n+ctp5sOOqnrJnmtX1UnLuOYe65N8YTo+Z6GaklyX5Pzp3lJVJy80YHef1t0bu3tjksszW0YhTAAA\nAGBRhyJQ+ECSdVV1Z5KtST6a5O8zW/bw7qq6Lf+yNOCPkpy+Z1PGvcY5O7O9AG7P7KkGr1viuj+a\n5JNVdWuSJ2e2B8N8np5ZQPHD03VvXeIRjFcnuXLq921T2zVJ/q675y4puD/JKVX1ySQ/PKfelyX5\niem+70iy6IaJe3ljkl+pqlvy4NklNyR54p5NGTObyXBkktur6o7pNQAAABww1d0rXcOqV1VXJLml\n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\nGCZQAAAAAIYJFAAAAIBhAgUAAABgmKc8MOzEY9dn29YtK10GAAAAK8gMBQAAAGCYQAEAAAAYJlAA\nAAAAhgkUAAAAgGECBQAAAGCYQAEAAAAYJlAAAAAAhgkUAAAAgGECBQAAAGCYQAEAAAAYJlAAAAAA\nhgkUAAAAgGECBQAAAGCYQAEAAAAYJlAAAAAAhgkUAAAAgGECBQAAAGCYQAEAAAAYJlAAAAAAhgkU\nAAAAgGECBQAAAGCYQAEAAAAYJlAAAAAAhgkUAAAAgGECBQAAAGCYQAEAAAAYJlAAAAAAhgkUAAAA\ngGECBQAAAGDYupUugNVn+xfuycYL37fSZcCqsXPrlpUuAQAADjgzFAAAAIBhAgUAAABgmEABAAAA\nGCZQAAAAAIYJFAAAAIBhAgUAAABgmEABAAAAGCZQAAAAAIYJFAAAAIBhAgUAAABgmEABAAAAGCZQ\nAAAAAIY9ZAKFqnpGVZ065/V5VfVjB/ma311VN1TVp6rqjqr6T0v0P6eqHn0waxpVVZuq6kf28dyN\nVfXfq+rW6efKA10fAAAAh6d1K13AHM9Icl+SDydJdx+KL7f/lORnuvsTVfWIJDdX1Z9296cW6H9O\nkk8m+eIhqO2fVdW67v6nBd7elGRzkj/Zx+H/trs37eO5AAAArFEHfYZCVb23qm6eZgCcO7U9v6o+\nUVW3VdX1VbUxyXlJXj39p/y0qrq4qi6Y+m+qqo9W1e1V9Z6q+tdT+41VdWlVfbyqPltVp03tT5ra\nbp3OOX6+2rr7ru7+xHR8b5I7kxy7wH2ckdkX92umcbdU1XvnvP+cqnrPdHxfVV023fP1VfWdU/vj\nq+oD0+dxU1WdsMjndnVVXVlVH0vyxqo6pao+UlW3VNWHq+rfVNW3JnldkjOnms6sqqOr6m3T/d9S\nVS9c9h8LAAAAlulQLHl4eXd/b2Zfxl9ZVd+V5DeSvLi7T0ryku7emeTKJJd196buvmmvMX4ryWu6\n+ylJtif5pTnvrevuU5K8ak77eUl+bfrP++Ykn1+qyCnUODnJx+Z7v7vflWRbkpdN4/5JkhP2hAVJ\nfjzJ26bjo5Ns6+4nJfnzOXVdleT86fO4IMlblyjrMUlO7e6fTvLpJKd198lJfjHJG7r7H6fjd06f\n2zuTXJTkg9Nn8swkb6qqoxe5xmOn4OHP9wQy86mqc6tqW1Vt2/X1e5YoGwAAgMPdoVjy8MqqOn06\n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\nqf09VfXyuf2m3y+oqk9W1Yer6stVtamqjq2qy6tqa1U9Zep3zHTvV1XVRTv1JgIAALCqrPpAoaqe\nneRnkhyW5DlJfiHJdyU5IMk7u/vpSb6V5LcyCxKen+TAOUO8PckZ3f2DSV6W5A/mnDswyQu7+6d2\nUbn7Jrm0uw9JctFU61IOSXJikh9IclySp3b3oVOdr536vCHJUdO4L5lvkKo6oao2V9Xmu++87T7e\nBgAAALs7Wx5mAcGHuvuOJKmqc5IcnuR/dfelU5/Dknyiu7829flAkqdO516Y5MDZzogkyaOr6pHT\n8V929z/twlq/leSvp+Mrkhy5jGs+2923JElVfSnJx6b2rUmOmI4vSfKeqvrTJOfMN0h3n5XkrCTZ\nZ+0BvVPVAwAAsMcQKCzsjmX2e0iS53T3vbYtTAHDcsdYrn/u7u0f5u/Od/5+357qSFU9JMlD51xz\n15zje+a8vmf79d19YlUdlmRjkiuq6tndfesurh0AAIA9yKrf8pDk4iQ/UVWPqKp9kxw9tc11WZIf\nmb6VYe8kx8w597F8Z+tAqmr9/V3wPLYlefZ0/JIke49cXFVP6e7LuvsNSb6W5Im7tjwAAAD2NKt+\nhUJ3X1lV70ly+dT0B0m+vkOfW6rqtCSfSfKPSbbMOX1Skt+rqqszez8vyuyZBctSVduSPDrJQ6vq\nJ5K8qLs/P3gbv5/kw1V1VZLzMr4y4vSqOiBJJbkgyVWD1wMAALDK1HdW0MPy7LP2gF57/NtWugxY\n1LZNG1e6BAAA2C1V1RXdvWGpfrY8AAAAAMNW/ZaHB0JVHZXkrTs039DdRy/Q/7Ik++zQfFx3b70/\n6gMAAIBRAoUHQHefn+T8gf6H3Y/lAAAAwH1mywMAAAAwTKAAAAAADBMoAAAAAMMECgAAAMAwgQIA\nAAAwTKAAAAAADPO1kQw7eP/9snnTxpUuAwAAgBVkhQIAAAAwTKAAAAAADBMoAAAAAMMECgAAAMAw\ngQIAAAAwTKAAAAAADBMoAAAAAMMECgAAAMAwgQIAAAAwTKAAAAAADBMoAAAAAMMECgAAAMAwgQIA\nAAAwTKAAAAAADBMoAAAAAMMECgAAAMAwgQIAAAAwTKAAAAAADBMoAAAAAMMECgAAAMAwgQIAAAAw\nTKAAAAAADBMoAAAAAMMECgAAAMAwgQIAAAAwTKAAAAAADBMoAAAAAMMECgAAAMAwgQIAAAAwbM1K\n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\nvDezD+F/WFWbp//u/9bU56Qkj09yYVVdOLW9qKo+U1VXVtUHq+qRC83R3R/pSZLLkzxhOvWqJOd0\n999O/b66WK3dfVGSf1jOfXX3dd19/XL6VtWrq+qcqjqvqr5YVf9lzrnb5xy/vKreMx2/p6r+a1Vd\nWlVfnlZavLuqrpvTZ6+p3zVVtbWqXrecegAAAFjd1qx0AQMOSHJ8d19aVf+qu/+hqvZKckFVPaO7\nz6yqX01yRHf/fVV9d5L/lOSF3X1HVf16kl9N8qbFJpm2OhyX5Fempqcm2buqPpHkUUne3t3vvX9u\ncUnrkzwzyV1Jrq+q3+3uv1vimu9K8kNJXpLkL5M8L7PVF5+tqvVJ9kqyf3cflPyfFRn/QlWdkOSE\nJNnr0Y/bBbcCAADA7mx3ChT+V3dfOh2/YvqAuybJ2iQHJrl6h/7PmdovqaokeWiSzyxjnncmuai7\nL55er0ny7CQ/ltlWiM9U1aXd/YX7cjM76YLuvi1JqurzSb43yVKBwl91d1fV1iRf6e6t0/XXJlmX\n5JNJnlxVv5vk3CQfm2+Q7j4ryVlJss/aA3oX3AsAAAC7sd0pULgjSarq+5K8PskPdvfXp6X7D5un\nfyX5n939U8udoKremORxSX5xTvONSW7t7juS3FFVFyU5JMlKBAp3zTm+O9/5+839gL/je7H9mnt2\nuP6eJGum9/CQJEclOTHJK5L87C6rGAAAgD3SbvEMhR08OrNw4baq+p4k/3bOuW9kti0hSS5N8ryq\n+v4kqap9q+qpCw1aVT+f2Yfqn+rue+ac+nCS51fVmukbJA5Lct0uu5td4ytV9QPTwyqPHrlw2hry\nkO7+88y2iDzr/igQAACAPctuFyh091VJPpfkb5K8P8klc06fleS8qrqwu7+W5NVJ/qSqrs5su8PT\nFhn6XUm+J7MtDVuq6g3TfNclOS+zLRWXJ/mD7l7wKyGr6k+muf5NVd1YVT+3SN+jq+rGzJ5xcG5V\nnb/43S/olCR/neTTSW4ZvHb/JJ+oqi1J/jjJb+xkDQAAAKwiNftSA1i+fdYe0GuPf9tKl8EeaNum\njStdAgAArHpVdUV3b1iq3263QgEAAABYebvTQxl3iar6UJLv26H517t72dsNquqxSS6Y59SPdfet\n8/T/vcy+rnGut3f3H83T96gkb92h+YbuHno2AgAAANyfVl2gsCs+mE+hwfqB/r800Pf8JDv7LAUA\nAAB4QNjyAAAAAAwTKAAAAADDBAoAAADAMIECAAAAMEygAAAAAAwTKAAAAADDVt3XRnLfHbz/ftm8\naeNKlwEAAMAKskIBAAAAGCZQAAAAAIYJFAAAAIBhAgUAAABgmEABAAAAGCZQAAAAAIYJFAAAAIBh\nAgUAAABgmEABAAAAGCZQAAAAAIYJFAAAAIBhAgUAAABgmEABAAAAGCZQAAAAAIYJFAAAAIBhAgUA\nAABgmEABAAAAGCZQAAAAAIYJFAAAAIBhAgUAAABgmEABAAAAGCZQAAAAAIYJFAAAAIBhAgUAAABg\nmEABAAAAGCZQAAAAAIYJFAAAAIBhAgUAAABgmEABAAAAGLZmpQtg97P1ptuy7pRzV7oM9kDbNm1c\n6RIAAIBlskIBAAAAGCZQAAAAAIYJFAAAAIBhAgUAAABgmEABAAAAGCZQAAAAAIYJFAAAAIBhAgUA\nAABgmEABAAAAGCZQAAAAAIYJFAAAAIBhAgUAAABgmEBhCVV1UlVdV1VnD163rqpetcy+T6qq26vq\n9TtR38lV9YgFzr26qt6xyLU/XFVXVtW3q+rlo3MDAACwegkUlvaaJEd297GD161LsqxAIcnvJPno\n4PjbnZxk3kBhGf42yauTvH8nrwcAAGCVWrPSBTyYVdW7kjw5yUer6n8keUqSg5LsneS07v5wVa1L\n8r4k+06X/XJ3fzrJpiQ/UFVbkvz37j5jgTl+IskNSe5YopZ9k/xpkick2SvJm5N8T5LHJ7mwqv6+\nu4+oqp9J8htJ/jHJVUnuWmjM7t42jX3P4u9EUlUnJDkhSfZ69OOW6g4AAMAezgqFRXT3iUluTnJE\nZoHBx7v70On16dOH/K9mtoLhWUlemeTM6fJTklzc3esXCRMemeTXk/zWMsp5cZKbu/uQ7j4oyXnd\nfeb2+qYwYe001vOSPD/JgTt14/Po7rO6e0N3b9jrEfvtqmEBAADYTQkUlu9FSU6ZVhx8IsnDkjwp\ns9UKv19VW5N8MGMf4k9LckZ3376MvluTHFlVb62qw7v7tnn6HJbkE939te7+VpIPDNQCAAAAy2bL\nw/JVkpd19/X3aqw6LclXkhySWUDzzYExD0vy8qr6L0kek+Seqvpmd/+LByl29xeq6llJfjzJb1fV\nBd39pp27FQAAALhvrFBYvvOTvLaqKkmq6plT+35Jbunue5Icl9nzDZLkG0ketdiA3X14d6/r7nVJ\n3pbkP88XJkzzPT7Jnd39x0lOT/Kseea5LMmPVNVjq2rvJMeM3yYAAAAsTaCwfG/ObHvD1VV17fQ6\nSd6Z5PiquirJ0/KdhyteneTuqrqqql63C+Y/OMnl05aLNyb57an9rCTnVdWF3X1LZtsoPpPkkiTX\nLTZgVf1gVd2YWfDw36b7AgAAgCVVd690Dexm9ll7QK89/m0rXQZ7oG2bNq50CQAAsOpV1RXdvWGp\nflYoAAAAAMM8lPEBUFVHJXnrDs03dPfR8/R9bJIL5hnmx7r71p2c/9T8y+cpfLC737Iz4wEAAIBA\n4QHQ3edn9lDH5fS9Ncn6XTz/W5IIDwAAANhlbHkAAAAAhgkUAAAAgGECBQAAAGCYQAEAAAAYJlAA\nAAAAhvmWB4YdvP9+2bxp40qXAQAAwAqyQgEAAAAYJlAAAAAAhgkUAAAAgGECBQAAAGCYQAEAAAAY\nJlAAAAAAhgkUAAAAgGECBQAAAGCYQAEAAAAYJlAAAAAAhgkUAAAAgGECBQAAAGCYQAEAAAAYJlAA\nAAAAhgkUAAAAgGECBQAAAGCYQAEAAAAYJlAAAAAAhgkUAAAAgGECBQAAAGCYQAEAAAAYJlAAAAAA\nhgkUAAAAgGECBQAAAGCYQAEAAAAYJlAAAAAAhgkUAAAAgGECBQAAAGCYQAEAAAAYtmalC2D3s/Wm\n27LulHNXugz2ENs2bVzpEgAAgJ1ghQIAAAAwTKAAAAAADBMoAAAAAMMECgAAAMAwgQIAAAAwTKAA\nAAAADBMoAAAAAMMECgAAAMAwgQIAAAAwTKAAAAAADBMoAAAAAMMECgAAAMCwVR0oVNVJVXVdVZ09\neN26qnrVEn2OrKorqmrr9PtH55x79tT+/1XVmVVVO3sPc8b89E5ed3ZVXV9V11TVu6tq7/taCwAA\nAHu+VR0oJHlNkiO7+9jB69YlWTRQSPL3Sf59dx+c5Pgk75tz7r8m+YUkB0w/Lx6c/1/o7ufu5KVn\nJ3lakoOTPDzJz9/XWgAAANjzrdpAoareleTJST5aVadO/52/vKo+V1Uvnfqsq6qLq+rK6Wf7h/ZN\nSQ6vqi1V9br5xu/uz3X3zdPLa5M8vKr2qaq1SR7d3Zd2dyd5b5KfWKTOT1TVGVW1eVpN8YNVdU5V\nfbGqfntOv9un3y+YrvmzqvqbaQXCgisguvsjPUlyeZInLFDHCVMNm+++87aFhgMAAGCVWLWBQnef\nmOTmJEck2TfJx7v70On16VW1b5KvZraC4VlJXpnkzOnyU5Jc3N3ru/uMZUz3siRXdvddSfZPcuOc\nczdObYv5VndvSPKuJB9O8ktJDkry6qp67Dz9n5nk5CQHZhaaPG+pAqetDsclOW++8919Vndv6O4N\nez1iv6WGAwAAYA+3ZqULeJB4UZKXVNXrp9cPS/KkzAKHd1TV+iR3J3nq6MBV9fQkb53m2Fl/Of3e\nmuTa7r5lGvvLSZ6Y5NYd+l/e3TdOfbZktkXjU0vM8c4kF3X3xfehTgAAAFYJgcJMJXlZd19/r8aq\n05J8Jckhma3m+ObQoFVPSPKhJD/d3V+amm/KvbcVPGFqW8xd0+975hxvfz3f33Bun7sX6DO3zjcm\neVySX1yiDgAAAEiyirc87OD8JK/d/qyBqnrm1L5fklu6+57MtgPsNbV/I8mjFhuwqh6T5Nwkp3T3\nJdvbp9UF/7uqnjPN99OZbWNYEVX180mOSvJT030CAADAkgQKM29OsneSq6vq2ul1MtsGcHxVXZXZ\nNyHcMbVf/f+zd+9hnlXlnei/b2gDXrA1ajgtahoVxQsXtTVeI6gRTScq0ehRB/E2xImGqGGO5Ogo\njpNzWh3HOzLEIJoQT45P1JgYIIaAMCgxzbVBxUTBHJGjiZJWIRqFd/6o3ZOyraquVX2pru7P53nq\nqf1be+213r3rr9+31t47yS1VdcV8D2VM8ook903y+unhjZdX1c9O+34jyfuT/H2SLyc5a4ef0eKd\nmuSAJJ+danz9MtYCAADAClEzD/eHxdt3zcG95rh3LHcZ7CGu27B+uUsAAABmqapLphcDLMgKBQAA\nAGCYhzJup6o6OjNvcZjt2u4+ZnCc9+YnX+/4zu7+wPbUN2v8jyU5aKvm13T3OTtifAAAAPYuAoXt\nNH0h3+4v5d398h1QzkLjDwUcAAAAsBC3PAAAAADDBAoAAADAMIECAAAAMEygAAAAAAwTKAAAAADD\nvOWBYYceuDobN6xf7jIAAABYRlYoAAAAAMMECgAAAMAwgQIAAAAwTKAAAAAADBMoAAAAAMMECgAA\nAMAwgQIAAAAwTKAAAAAADBMoAAAAAMMECgAAAMAwgQIAAAAwTKAAAAAADBMoAAAAAMMECgAAAMAw\ngQIAAAAwTKAAAAAADBMoAAAAAMMECgAAAMAwgQIAAAAwTKAAAAAADBMoAAAAAMMECgAAAMAwgQIA\n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\n9z8meWGSD1fVlZm53eGQBYY+NckBST5bVZdX1eun9tcnuUuSU6b2jQvVV1Ufnua6f1V9rapeso1T\nOjPJrUn+chv9AAAAIDXzMgH2dlV1YpLV3f2fttV33zUH95rj3rELqmKluW7D+uUuAQAA2E5Vdcn0\nAoIFeYYCqaqPJblPkicsdy0AAACsDAKFZTJ9iT9oq+bXdPc5A2PcJcm5c+x64lwPVqyq9yZ5zFbN\n7+zuYxY7JwAAACQChWWzI77ET6HBEQP9X769cwIAAEDioYwAAADAEggUAAAAgGECBQAAAGCYQAEA\nAAAYJlAAAAAAhnnLA8MOPXB1Nm5Yv9xlAAAAsIysUAAAAACGCRQAAACAYQIFAAAAYJhAAQAAABgm\nUAAAAACGCRQAAACAYQIFAAAAYJhAAQAAABgmUAAAAACGCRQAAACAYQIFAAAAYJhAAQAAABgmUAAA\nAACGCRQAAACAYQIFAAAAYJhAAQAAABgmUAAAAACGCRQAAACAYQIFAAAAYJhAAQAAABgmUAAAAACG\nCRQAAACAYQIFAAAAYJhAAQAAABgmUAAAAACGCRQAAACAYQIFAAAAYJhAAQAAABgmUAAAAACGCRQA\nAACAYauWuwBWnk3Xb87akz653GWwi123Yf1ylwAAAOxGrFAAAAAAhgkUAAAAgGECBQAAAGCYQAEA\nAAAYJlAAAAAAhgkUAAAAgGECBQAAAGCYQAEAAAAYJlAAAAAAhgkUAAAAgGECBQAAAGDYiggUqurI\nqnr0rM8vq6oXLGGco6vq8unne1V1zbT9oapaV1Xv2rGV/9jcJ1fV9bPm/6VZ+z5cVVdW1auWMO6P\nXZt5+ry6qj4/zXFuVf3crH23zKrpE6PzAwAAsHdatdwFLNKRSb6X5DNJ0t2nLmWQ7j4nyTlJUlXn\nJzmxuzfO6rJxruN2oLd393+d3VBV/1uSh3f3fZc45pGZdW3mcVmSdd19c1X9hyRvSfKcad+/dPcR\nS5wbAACAvdSyrlCoqo9X1SVVdXVVHT+1PaWqLq2qK6b/pq9N8rIkr5r+i/646b/9J079j6iqi6f/\nvn+squ48tZ9fVW+uqs9V1Zeq6nHbqOXIqvrzafvkqvpgVV1YVV+tql+tqrdU1aaqOruqbjP1e1hV\nfXo6h3Oqas0SLsNfJjlw1rndZ5rjkmn+Q6a5fqWq/qaqLquqv6qqA+a6NnNN0N3ndffN08eLk9xj\nCXUCAADA/7Lctzy8uLsflmRdkhOq6oAkv5fkmd19eJJf6+7rkpyamf/uH9HdF241xoeSvKa7D0uy\nKckbZu1b1d2PSPLKrdoX4z5JnpDkaUn+MMl53X1okn9Jsn4KFd6d5FnTOZye5He3MeYrpuDj9C3B\nxzT+l2ed22lJfnMa88Qkp0z9/keSR3b3Q5L8P0n+j0Vcm7m8JMlZsz7vV1Ubp1DmGfMdVFXHT/02\n3nLz5kVMAwAAwJ5suW95OKGqjpm275nk+CQXdPe1SdLd317o4KpaneRO3f3pqemDST4yq8tHp9+X\nJFk7WNtZ3f3DqtqUZJ8kZ0/tm6ax7p/kwUk+VVWZ+tywwHjvS/KmJD39fluSF291PndI8ugkH5nG\nTJJ9p9/3SPLH0yqIn05y7eD5pKr+XWbCm8fPav657r6+qu6d5K+ralN3f3nrY7v7tMyEHdl3zcE9\nOjcAAAB7lmULFKrqyCRPSvKo6d7+85NcnuSQHTjND6bft2T8XH+QJN19a1X9sLu3fIm+dRqrklzd\n3Y9azGDd/Y0t21X1e0n+fI5uP5Xkn+d5psG7k/y37v7EdO1OXuyJTHM+Kclrkzy+u7dcl3T39dPv\nr0x/g4ck+YlAAQAAAGZbzlseVie5cQoTDknyyCT7JfmFqjooSarqZ6a+302y/9YDdPfmJDfOenbA\nsUk+vXW/neSaJHerqkclSVXdpqoeNF/nrZ6vcEySq7bu093fSXJtVf3adExV1eHT7tVJrp+2j5t1\n2JzXZqu5H5Lkvyd5Wnd/c1b7natq32n7rkkek+TzC40FAAAAyfIGCmcnWVVVX0iyITMPC/zHzNz2\n8NGquiLJH099/yzJMfM8ePC4JG+tqiuTHJHkP++K4rv7X5M8K8mbp1ovz8ztCvPZ8lDHK5MclWS+\nV0Q+P8lLpjGvTvL0qf3kzNwKcUmSf5rVf6Frs8Vbk9xhOn726yEfkGTjNNd5STZ0t0ABAACAbap/\nW8kPi7PvmoN7zXHvWO4y2MWu27B+uUsAAAB2gaq6pLvXbavfcr/lAQAAAFiBlvstD3ucqnpvZp5F\nMNs7u/sDu2Du1yb5ta2aP9Ld23qdJQAAAAwRKOxg3f3yZZz7d5MIDwAAANjp3PIAAAAADBMoAAAA\nAMMECgAAAMAwgQIAAAAwTKAAAAAADBMoAAAAAMO2+drIqjogyf+V5O7d/dSqemCSR3X37+/06tgt\nHXrg6mzcsH65ywAAAGAZLWaFwhlJzkly9+nzl5K8cmcVBAAAAOz+FhMo3LW7/98ktyZJd/8oyS07\ntSoAAABgt7aYQOGmqrpLkk6Sqnpkks07tSoAAABgt7bNZygkeXWSTyS5T1VdlORuSZ61U6sCAAAA\ndmsLBgpV9VNJ9kvy+CT3T1JJrunuH+6C2gAAAIDd1IKBQnffWlXv7e6HJLl6F9UEAAAA7OYW8wyF\nc6vqmVVVO70aAAAAYEVYTKDw60k+kuQHVfWdqvpuVX1nJ9cFAAAA7Ma2+VDG7t5/VxQCAAAArBzb\nDBSq6hfmau/uC3Z8OQAAAMBKsJjXRv7HWdv7JXlEkkuSPGGnVAQAAADs9hZzy8OvzP5cVfdM8o6d\nVhEAAACw21vMQxm39rUkD9jRhQAAAAArx2KeofDuJD19/KkkRyS5dGcWBQAAAOzeFvMMhY2ztn+U\n5MPdfdFOqgcAAABYARYTKNypu985u6GqfmvrNgAAAGDvsZhnKBw3R9sLd3AdAAAAwAoy7wqFqnpu\nkuclOaiqPjFr1/5Jvr2zCwMAAAB2Xwvd8vCZJDckuWuSt81q/26SK3dmUQAAAMDubd5Aobu/muSr\nSR6168oBAAAAVoJtPkOhqh5ZVX9bVd+rqn+tqluq6ju7ojgAAABg97SYhzK+J8lzk/xdktsmeWmS\n9+7MogAAAIDd22IChXT33yfZp7tv6e4PJHnKzi0LAAAA2J0t9FDGLW6uqp9OcnlVvSUzD2pcVBAB\nAAAA7JkWEwwcO/V7RZKbktwzyTN3ZlEAAADA7m2bKxS6+6tVddska7r7jbugJgAAAGA3t5i3PPxK\nksuTnD19PqKqPrGzCwMAAAB2X4u55eHkJI9I8s9J0t2XJzloJ9YEAAAA7OYWEyj8sLs3b9XWO6MY\nAAAAYGVYzFserq6q5yXZp6oOTnJCks/s3LLYnW26fnPWnvTJ5S6DXey6DeuXuwQAAGA3Mu8Khar6\ng2nzy0kelOQHST6c5DtJXrnzSwMAAAB2VwutUHhYVd09yXOSHJXkbbP23S7J93dmYQAAAMDua6FA\n4dQk5ya5d5KNs9orM89QuPdOrAsAAADYjc17y0N3v6u7H5Dk9O6+96yfg7pbmAAAAAB7sW2+5aG7\n/8OuKAQAAABYORbz2kgAAACAHyNQAAAAAIYJFAAAAIBhAgUAAABgmEABAAAAGCZQAAAAAIYJFAAA\nAIBhe2SgUFUnVNUXqurMwePWVtXzttHnF6vqkqraNP1+wqx9D5va/76q3lVVtdRz2BWqanVV/VlV\nXVFVV1fVi5a7JgAAAFaGPTJQSPIbSX6xu58/eNzaJAsGCkn+KcmvdPehSY5L8gez9r0vyb9PcvD0\n85TB+Xe1lyf5fHcfnuTIJG+rqp9e3pIAAABYCfa4QKGqTk1y7yRnVdVrq+r0qvpcVV1WVU+f+qyt\nqgur6tLp59HT4RuSPK6qLq+qV801fndf1t1fnz5eneS2VbVvVa1Jcsfuvri7O8mHkjxjgTrPr6q3\nV9XGaTXFw6vqo1X1d1X1X2b1+3dT/ZdX1X+vqn2m9vdNx15dVW+c1f+6qnrjdF6bquqQBS5XJ9l/\nWklxhyTfTvKjeeo9fppv4y03b15gSAAAAPYGe1yg0N0vS/L1JEcluX2Sv+7uR0yf31pVt0/yzcys\nYHhokuckedd0+ElJLuzuI7r77YuY7plJLu3uHyQ5MMnXZu372tS2kH/t7nVJTk3yp5lZMfDgJC+s\nqrtU1QOm+h7T3UckuSXJllUXr52OPSzJ46vqsFnj/tN0bu9LcuIC878nyQMyc702Jfmt7r51ro7d\nfVp3r+vudfvcbvU2TgsAAIA93arlLmAne3KSp1XVli/V+yW5V2a+QL+nqrZ8Sb/f6MBV9aAkb57m\nWKpPTL83Jbm6u2+Yxv5KknsmeWyShyX52+lxDLfNTBiSJM+uquMz8zdck+SBSa6c9n10+n1Jkl9d\nYP6jk1ye5AlJ7pPkU1V1YXd/ZzvOCQAAgL3Anh4oVJJndvc1P9ZYdXKSbyQ5PDOrNL4/NGjVPZJ8\nLMkLuvvLU/P1Se4xq9s9praF/GD6feus7S2fV031f7C7f2er+Q/KzMqDh3f3jVV1RmbCkq3HvSUL\n/41flGTDdIvG31fVtUkOSfK5bdQNAADAXm6Pu+VhK+ck+c0tb1uoqodM7auT3DAt7z82yT5T+3eT\n7L/QgFV1pySfTHJSd1+0pX1aXfCdqnrkNN8LMnMbw/Y4N8mzqupnp7l/pqp+Lskdk9yUZHNVHZDk\nqUsc/x+SPHEa+4Ak90/yle2sGQAAgL3Anh4ovCnJbZJcWVVXT5+T5JQkx1XVFZn5j/xNU/uVSW6Z\nXqM450MZk7wiyX2TvH56UOLlW77wZ+btEu9P8vdJvpzkrO0pvrs/n+R1Sf6yqq5M8qkka7r7iiSX\nJflikj9KctH8oyzoTUkeXVWbMhNevKa7/2l7agYAAGDvUDOr3WHx9l1zcK857h3LXQa72HUb1i93\nCQAAwC5QVZdMLwFY0J6+QgEAAADYCfb0hzIuWVUdnZm3OMx2bXcfMzjOe5M8Zqvmd3b3B7anvsEa\nXpTkt7Zqvqi7X76ragAAAGDPIlCYR3efk5mHOm7vOMv+pX0KL3ZZgAEAAMCezy0PAAAAwDCBAgAA\nADBMoAAAAAAMEygAAAAAwwQKAAAAwDBveWDYoQeuzsYN65e7DAAAAJaRFQoAAADAMIECAAAAMEyg\nAAAAAAwTKAAAAADDBAoAAADAMIECAAAAMEygAAAAAAwTKAAAAADDBAoAAADAMIECAAAAMEygAAAA\nAAwTKAAAAADDBAoAAADAMIECAAAAMEygAAAAAAwTKAAAAADDBAoAAADAMIECAAAAMEygAAAAAAwT\nKAAAAADDBAoAAADAMIECAAAAMEygAAAAAAwTKAAAAADDBAoAAADAMIECAAAAMEygAAAAAAwTKAAA\nAADDBAoAAADAsFXLXQArz6brN2ftSZ9c7jLYSa7bsH65SwAAAFYAKxQAAACAYQIFAAAAYJhAAQAA\nABgmUAAAAACGCRQAAACAYQIFAAAAYJhAAQAAABgmUAAAAACGCRQAAACAYQIFAAAAYJhAAQAAABgm\nUAAAAACG7VGBQlW9sqput8Rjz6yqa6rqqqo6vapuM2vfkVV1eVVdXVWf3sY4p1fVN6vqqkXMeXJV\nXT+NfXlV/dJSagcAAIBdbcUFCjVjvrpfmWRJgUKSM5MckuTQJLdN8tJpvjslOSXJ07r7QUl+bRvj\nnJHkKQPzvr27j5h+/mK4agAAAFgGKyJQqKq10+qBDyW5KsnvV9XGacXAG6c+JyS5e5Lzquq8qe3J\nVfXZqrq0qj5SVXeYb47u/oueJPlckntMu56X5KPd/Q9Tv28uVGt3X5Dk29t5yj+hql5YVR+tqrOr\n6u+q6i2z9n1v1vazquqMafuMqnpfVV1cVV+ZVlqcXlVfmNVnn6nfVVW1qapeNc/8x0/XfOMtN2/e\n0acHAADACrMiAoXJwUlOmVYJ/HZ3r0tyWJLHV9Vh3f2uJF9PclR3H1VVd03yuiRP6u6HJtmY5NXb\nmmS61eHYJGdPTfdLcueqOr+qLqmqF+zg83pFVV05fdG/8zb6HpHkOZlZRfGcqrrnIsa/c5JHJXlV\nkk8keXuSByU5tKqOmMY8sLsf3N2HJvnAXIN092ndva671+1zu9WLOzMAAAD2WCspUPhqd188bT+7\nqi5Ncllmvhw/cI7+j5zaL6qqy5Mcl+TnFjHPKUku6O4Lp8+rkjwsyfokRyf5T1V1v6Wfxo95X5L7\nZOZL/Q1J3raN/ud29+bu/n6Sz2dx5/Nn06qLTUm+0d2buvvWJFcnWZvkK0nuXVXvrqqnJPnO0k4F\nAACAvcmq5S5gwE1JUlUHJTkxycO7+8Zp6f5+c/SvJJ/q7ucudoKqekOSuyX59VnNX0vyre6+KclN\nVXVBksOTfGlJZzFLd39j1ty/l+TPt3HID2Zt35J/+/v1rPatr8WWY27d6vhbk6yaruHhmQlLXpbk\n2UlevKgTAAAAYK+1klYobHHHzIQLm6vqgCRPnbXvu0n2n7YvTvKYqrpvklTV7RdaWVBVL83Ml+rn\nTv/B3+JPkzy2qlZNb5D4+SRf2BEnUlVrZn08JjPPh1iKb1TVA6aHVR4zWMNdk/xUd/9JZm4ReegS\nawAAAGAvspJWKCRJuvuKqrosyReT/H9JLpq1+7QkZ1fV16fnKLwwyYerat9p/+sy/8qCU5N8Ncln\nqyqZeRDjf+7uL1TV2UmuzMx/9d/f3fN+8a+qDyc5Msldq+prSd7Q3b8/T/e3TM8x6CTX5cdXRow4\nKTOrG/4xM8+KmPfhk3M4MMkHZr0543eWWAMAAAB7kZq5vR4Wb981B/ea496x3GWwk1y3Yf1ylwAA\nACyjqrpkehHCglbiLQ8AAADAMltxtzxsr6r6WJKDtmp+TXefMzDGXZKcO8euJ3b3t+bo/94kj9mq\n+Z3d/ROvaKyqo5O8eavma7t76NkIAAAAsDPtdYHCjvhiPoUGRwz0f/lA33OSLDrcAAAAgOXglgcA\nAABgmEABAAAAGCZQAAAAAIYJFAAAAIBhAgUAAABg2F73lge236EHrs7GDeuXuwwAAACWkRUKAAAA\nwDCBAgAAADBMoAAAAAAMEygAAAAAwwQKAAAAwDCBAgAAADBMoAAAAAAMEygAAAAAwwQKAAAAwDCB\nAgAAADBMoAAAAAAMEygAAAAAwwQKAAAAwDCBAgAAADBMoAAAAAAMEygAAAAAwwQKAAAAwDCBAgAA\nADBMoAAAAAAMEygAAAAAwwQKAAAAwDCBAgAAADBMoAAAAAAMEygAAAAAwwQKAAAAwDCBAgAAADBM\noAAAAAAMEygAAAAAwwQKAAAAwDCBAgAAADBs1XIXwMqz6frNWXvSJ5e7DHaS6zasX+4SAACAFcAK\nBQAAAGCYQAEAAAAYJlAAAAAAhgkUAAAAgGECBQAAAGCYQAEAAAAYJlAAAAAAhgkUAAAAgGECBQAA\nAGCYQAEAAAAYJlAAAAAAhgkUAAAAgGEChZ2gql5ZVbdb4rFnVtU1VXVVVZ1eVbeZ2p9fVVdW1aaq\n+kxVHb6NcU6vqm9W1VVLqQMAAAAWIlBYopox3/V7ZZIlBQpJzkxySJJDk9w2yUun9muTPL67D03y\npiSnbWOcM5I8ZYk1AAAAwIIECgOqau20euBDSa5K8vtVtbGqrq6qN059Tkhy9yTnVdV5U9uTq+qz\nVXVpVX2kqu4w3xzd/Rc9SfK5JPeY2j/T3TdO3S7e0r7AOBck+fYizmlVVf1tVR05ff6/q+p35+h3\n/HSuG2+5efO2hgUAAGAPJ1AYd3CSU7r7QUl+u7vXJTksyeOr6rDufleSryc5qruPqqq7Jnldkid1\n90OTbEzy6m1NMt3qcGySs+fY/ZIkZ+2Ik+nuHyV5YZL3VdWTMrOq4Y1z9Dutu9d197p9brd6R0wN\nAADACrZquQtYgb7a3RdP28+uquMzcx3XJHlgkiu36v/Iqf2iqkqSn07y2UXMc0qSC7r7wtmNVXVU\nZgKFxy75DLbS3VdX1R8k+fMkj+ruf91RYwMAALBnEiiMuylJquqgJCcmeXh331hVZyTZb47+leRT\n3f3cxU5QVW9Icrckv75V+2FJ3p/kqd39raWVP69Dk/xzkp/dweMCAACwB3LLw9LdMTPhwuaqOiDJ\nU2ft+26S/afti5M8pqrumyRVdfuqut98g1bVS5McneS53X3rrPZ7JflokmO7+0s78kSq6leT/EyS\nX0jy7qq6044cHwAAgD2PQGGJuvuKJJcl+WKSP0py0azdpyU5u6rO6+5/zMwzCj5cVVdm5naHQxYY\n+tQkByT5bFVdXlWvn9pfn+QuSU6Z2jcuVF9VfXia6/5V9bWqesk8/e6aZEOSl05BxXuSvHOhsQEA\nAKBmXiYAi7fvmoN7zXHvWO4y2Emu27B+uUsAAACWUVVdMr2AYEFWKAAAAADDPJRxmVTVx5IctFXz\na7r7nIEx7pLk3Dl2PXGuhzZW1XuTPGar5nd29wcWOycAAAAkAoVl093H7IAxvpXkiIH+L9/eOQEA\nACBxywMAAACwBAIFAAAAYJhAAQAAABgmUAAAAACGCRQAAACAYd7ywLBDD1ydjRvWL3cZAAAALCMr\nFAAAAIBhAgUAAABgmEABAAAAGCZQAAAAAIYJFAAAAIBhAgUAAABgmEABAAAAGCZQAAAAAIYJFAAA\nAIBhAgUAAABgmEABAAAAGCZQAAAAAIYJFAAAAIBhAgUAAABgmEABAAAAGCZQAAAAAIYJFAAAAIBh\nAgUAAABgmEABAAAAGCZQAAAAAIYJFAAAAIBhAgUAAABgmEABAAAAGCZQAAAAAIYJFAAAAIBhAgUA\nAABgmEABAAAAGCZQAAAAAIYJFAAAAIBhq5a7AFaeTddvztqTPrncZbCDXLdh/XKXAAAArEBWKAAA\nAADDBAoAAADAMIECAAAAMEygAAAAAAwTKAAAAADDBAoAAADAMIECAAAAMEygAAAAAAwTKAAAAADD\nBAoAAADAMIECAAAAMEygAAAAAAxbMYFCVZ1QVV+oqjMHj1tbVc/bRp+7VNV5VfW9qnrPIsa8rqru\nOlLHdNwLq+ru2+hzZlVdU1VXVdXpVXWbBfoeWVWPHq0DAAAAtteKCRSS/EaSX+zu5w8etzbJgoFC\nku8n+U9JTlxCXSNemGTBQCHJmUkOSXJoktsmeekCfY9MIlAAAABgl1sRgUJVnZrk3knOqqrXTv+5\n/1xVXVZVT5/6rK2qC6vq0ulnyxftDUkeV1WXV9Wr5hq/u2/q7v+RmWBhtLaPV9UlVXV1VR0/te1T\nVWdMqww2VdWrqupZSdYlOXOq5bbz1PIXPUnyuST3mGfetUleluRV03iPq6prt6xoqKo7bvlcVedX\n1TunfldV1SOmPref61rOM9/xVbWxqjbecvPm0csEAADAHmbVchewGN39sqp6SpKjkrw6yV9394ur\n6k5JPldVf5Xkm5lZwfD9qjo4yYcz8wX+pCQndvcv76TyXtzd354Cgr+tqj/JzKqIA7v7wUlSVXfq\n7n+uqldMtWzc1qBTMHBskt+aa393XzcFLd/r7v86HXN+kvVJPp7kf0/y0e7+YVUlye26+4iq+oUk\npyd5cJLXZo5r2d03zTHfaUlOS5J91xzci746AAAA7JFWxAqFrTw5yUlVdXmS85Psl+ReSW6T5Peq\nalOSjyR54C6q54SquiLJxUnumeTgJF9Jcu+qevcUhHxnCeOekuSC7r5w4Jj3J3nRtP2iJB+Yte/D\nSdLdFyS54xQgzHctAQAAYEErYoXCVirJM7v7mh9rrDo5yTeSHJ6ZoGT49oXhQqqOTPKkJI/q7pun\nFQL7dfeNVXV4kqMzc1vCs5O8eGDcNyS5W5JfH6mnuy+abv04Msk+3X3V7N1bd28iynwAACAASURB\nVM881xIAAAC2ZSWuUDgnyW/WtI6/qh4yta9OckN335qZWwX2mdq/m2T/nVTL6iQ3TmHCIUkeOdV0\n1yQ/1d1/kuR1SR662Fqq6qWZCSKeO53LQuYa70NJ/ig/vjohSZ4zjf/YJJu7e3Pmv5YAAACwoJUY\nKLwpM7c3XFlVV0+fk5lbBI6bbj84JMmW5wBcmeSWqrpivocyJjOvgkzy35K8sKq+VlWLuWXi7CSr\nquoLmXn448VT+4FJzp9uJfjDJL8ztZ+R5NSFHsqY5NQkByT57NTv9QvM/2dJjtnyUMap7cwkd850\ni8Ms36+qy6bxXzK1zXctAQAAYEE18zIB9hTT2ySe3t3Hzmo7P4t8GORi7Lvm4F5z3Dt2xFDsBq7b\nsH65SwAAAHYjVXVJd6/bVr+V+AwF5lFV707y1CS/tNy1AAAAsGfbqwKFqjo6yZu3ar62u4+Zp//f\nJNl3q+Zju3vTDqjlY0kO2qr5Nd19zhx9X5SffH3kRd398tkN3f2bc83V3UduR6kAAADwE/aqQGH6\nsv4TX9gX6P/zO7GWOUOMefp+ID/5kEUAAABYNivxoYwAAADAMhMoAAAAAMMECgAAAMAwgQIAAAAw\nTKAAAAAADNur3vLAjnHogauzccP65S4DAACAZWSFAgAAADBMoAAAAAAMEygAAAAAwwQKAAAAwDCB\nAgAAADBMoAAAAAAMEygAAAAAwwQKAAAAwDCBAgAAADBMoAAAAAAMEygAAAAAwwQKAAAAwDCBAgAA\nADBMoAAAAAAMEygAAAAAwwQKAAAAwDCBAgAAADBMoAAAAAAMEygAAAAAwwQKAAAAwDCBAgAAADBM\noAAAAAAMEygAAAAAwwQKAAAAwDCBAgAAADBMoAAAAAAMEygAAAAAwwQKAAAAwDCBAgAAADBMoAAA\nAAAMW7XcBbDybLp+c9ae9MnlLoPtcN2G9ctdAgAAsMJZoQAAAAAMEygAAAAAwwQKAAAAwDCBAgAA\nADBMoAAAAAAMEygAAAAAwwQKAAAAwDCBAgAAADBMoAAAAAAMEygAAAAAwwQKAAAAwLAVEShU1ZFV\n9ehZn19WVS9YwjhHV9Xl08/3quqaaftDVbWuqt61Yyv/sbl/pqo+VVV/N/2+89S+b1X91VTHc5Yw\n7jOq6oHb6PPWqvpiVV1ZVR+rqjtN7Wur6l9mXZNTl3Z2AAAA7G1WRKCQ5Mgk/ytQ6O5Tu/tDo4N0\n9zndfUR3H5FkY5LnT59f0N0bu/uEHVfyTzgpybndfXCSc6fPSfKQqbYjuvuPlzDuM5IsGCgk+VSS\nB3f3YUm+lOR3Zu378pZr0t0vW8L8AAAA7IWWNVCoqo9X1SVVdXVVHT+1PaWqLq2qK6rq3Kpam+Rl\nSV41/Rf9cVV1clWdOPU/oqounvXf9y3/+T+/qt5cVZ+rqi9V1eO2UcuRVfXn0/bJVfXBqrqwqr5a\nVb9aVW+pqk1VdXZV3Wbq97Cq+vR0DudU1ZoFpnh6kg9O2x9M8oyq+tkkf5jk4dO53We+Mavq31fV\n307X5U+q6nbTqo2nJXnrluPnmri7/7K7fzR9vDjJPRa6FgAAALAty71C4cXd/bAk65KcUFUHJPm9\nJM/s7sOT/Fp3X5fk1CRvn/6LfuFWY3woyWum/75vSvKGWftWdfcjkrxyq/bFuE+SJ2TmC/sfJjmv\nuw9N8i9J1k+hwruTPGs6h9OT/O4C4x3Q3TdM2///9PmbSV6a5MJp1cQ/LDDmR7v74dN1+UKSl3T3\nZ5J8Isl/nK7NlxdxXi9OctaszwdV1WVTiDFv6FJVx1fVxqraeMvNmxcxDQAAAHuyVcs8/wlVdcy0\nfc8kxye5oLuvTZLu/vZCB1fV6iR36u5PT00fTPKRWV0+Ov2+JMnawdrO6u4fVtWmJPskOXtq3zSN\ndf8kD07yqarK1OeGOcb5Cd3dVdVz7FpozAdX1X9Jcqckd0hyzuD5pKpem+RHSc6cmm5Icq/u/lZV\nPSzJx6vqQd39nTlqPi3JaUmy75qD56odAACAvciyBQpVdWSSJyV5VHffXFXnJ7k8ySE7cJofTL9v\nyfi5/iBJuvvWqvphd2/5En3rNFYlubq7H7XI8b5RVWu6+4bpNoZvztFnoTHPSPKM7r6iql6YmedK\nLNp0zC8neeKWc+nuH+TfzvOSqvpykvtl5vkSAAAAMK/lvOVhdZIbpzDhkCSPTLJfkl+oqoOSmTcj\nTH2/m2T/rQfo7s1Jbpy1VP/YJJ/eut9Ock2Su1XVo5Kkqm5TVQ9aoP8nkhw3bR+X5E8Hx9w/yQ3T\nrRbP/5/s3X20Z1V5J/jvI0Xj6xQmMTZBTSkhISpSxpIIDjYxGl2pjEqE2B2ioHYIEyPRiBGbmLBM\n21PIrPgSzTDYvkaiDorEV4hRQIyCqYKCApFklEoiMtFWgiKKCs/8cU+1l2vdW7WLKn5W3c9nrVr3\n/PZvn72fc+qv+7377DPvnK3em/mq6qlJ/jDJ07r71nntD6iqvabjhyU5MMkXlxoLAAAAktkGCucn\nWVFV1yZZl7nNAr+auccezq2qK5NseevBB5MctWVTxgXjHJe5TQmvSrI6ySvvjuK7+7tJjk5y+lTr\nxsx7E8VWrEvy5Kr6x8ytzFg3OOYrklyW5O+SfH7eae9O8tJpH4StbsqY5A2ZCx0+tuD1kE9IclVV\nbUzy3iQnbusxEwAAAEiS+sFKftg+++x3YO933GtnXQZ3weZ1a2ddAgAA8COqqjZ095pt9Zv1Wx4A\nAACA3dCs3/Kwx6mqNyZ5/ILm13X3W/fkuQEAAFheBAo7WXe/YDnODQAAwPLikQcAAABgmEABAAAA\nGCZQAAAAAIYJFAAAAIBhAgUAAABgmEABAAAAGOa1kQw7eP+VWb9u7azLAAAAYIasUAAAAACGCRQA\nAACAYQIFAAAAYJhAAQAAABgmUAAAAACGCRQAAACAYQIFAAAAYJhAAQAAABgmUAAAAACGCRQAAACA\nYQIFAAAAYJhAAQAAABgmUAAAAACGCRQAAACAYQIFAAAAYJhAAQAAABgmUAAAAACGCRQAAACAYQIF\nAAAAYJhAAQAAABgmUAAAAACGCRQAAACAYQIFAAAAYJhAAQAAABgmUAAAAACGCRQAAACAYQIFAAAA\nYJhAAQAAABgmUAAAAACGrZh1Aex+Nt1wc1ad8uFZl8FdsHnd2lmXAAAA7OasUAAAAACGCRQAAACA\nYQIFAAAAYJhAAQAAABgmUAAAAACGCRQAAACAYQIFAAAAYJhAAQAAABgmUAAAAACGCRQAAACAYQIF\nAAAAYJhAAQAAABi2WwQKVXVkVR0+7/OJVfWcHRjnKVW1cfp3S1VdNx2/o6rWVNXrd27ld5r7mKq6\npqruqKo1C757V1VdVVUv3oFx73RvFunzB1X1uWmOj1fVT8/77vZ59+QDo/MDAACwPK2YdQHb6cgk\ntyT5dJJ095k7Mkh3X5DkgiSpqouSnNzd6+d1Wb+183aSq5P8epL/e35jVf37JI/t7p/ZwXGPzLx7\ns4grkqzp7lur6n9P8uokz5q++3Z3r97BuQEAAFimZrpCoarOq6oN01/uT5janlpVl1fVldNf01cl\nOTHJi6e/oh9RVadV1clT/9VVden01/f3V9X9p/aLqur0qvpsVf1DVR2xjVqOrKoPTcenVdXbq+qS\nqvqnqvr1qnp1VW2qqvOrau+p32Oq6uLpGi6oqv0WG7+7r+3u67by1d8k2X/etR0wzbFhmv+gaa7/\nraouq6orqupvq+qBW7s3i8x9YXffOn28NMmDlroXi9yfE6pqfVWtv/3Wm0dPBwAAYA8z60centfd\nj0myJslJVfXAJG9K8szuPiTJMd29OcmZSV7T3au7+5IFY7wjycu6+1FJNiX5k3nfrejuQ5O8aEH7\n9jggyROTPC3JO5Nc2N0HJ/l2krVTqPDnSY6eruEtSV41OEem8b8w79rOSvLCacyTk/zF1O9TSR7X\n3Y9O8u4kf7gd92Zrnp/ko/M+33MKCi6tqmcsdlJ3n9Xda7p7zV73Xjl8kQAAAOxZZv3Iw0lVddR0\n/OAkJyT5ZHdfnyTd/fWlTq6qlUn27e6Lp6a3JzlnXpdzp58bkqwarO2j3f29qtqUZK8k50/tm6ax\nfi7JI5N8rKoy9blxcI47qar7Jjk8yTnTmEmyz/TzQUneM62C+HdJrt+B8X8rc+HNf5jX/NPdfUNV\nPSzJJ6pqU3d/YUevAQAAgOVhZoFCVR2Z5ElJDpue7b8oycYkB+3EaW6bft6e8Wu9LUm6+46q+l53\n99R+xzRWJbmmuw/bKZXOuUeSf1tkT4M/T/Jn3f2B6d6dNjJwVT0pyalJ/kN3b7kv6e4bpp9fnP4P\nHp1EoAAAAMCSZvnIw8okN01hwkFJHpfknkmeUFUPTZKq+rGp7zeT3G/hAN19c5Kb5u0d8OwkFy/s\nt4tcl+QBVXVYklTV3lX1iLsyYHd/I8n1VXXMNGZV1SHT1yuT3DAdHzfvtK3em/mq6tGZ2wzyad39\nlXnt96+qfabjn0jy+CSfuyvXAAAAwPIwy0Dh/CQrquraJOsyt1ngVzP32MO5VXVlkvdMfT+Y5KhF\nNh48LskZVXVVktVJXnl3FN/d301ydJLTp1o3Zu5xha2qqqOq6ktJDkvy4aq6YJGuxyZ5/jTmNUme\nPrWflrlHITYk+R/z+i91b7Y4I8l9p/Pnvx7y55Osn+a6MMm67hYoAAAAsE31g5X8sH322e/A3u+4\n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\ntK0ip1Dj0Uku29r33f3eJOuTHDuN+5EkB20JC5I8N8lbpuP7JFnf3Y9IcvG8us5K8sLpfpyc5C+2\nUdaDkhze3X+Q5PNJjujuRyf54yT/rbu/Ox2/Z7pv70lyapJPTPfkl5KcUVX32db1J3lWknct9mVV\nnVBV66tq/e233rwdwwEAALAnuzseeTipqo6ajh+c5IQkn+zu65Oku7++1MlVtTLJvt198dT09iTn\nzOty7vRzQ5JV0/FnkpxaVQ9Kcm53/+M25rhvkvcleVF3f2N7Lqq7u6r+MslvVdVbkxyWZMueD3ck\nec90/M4k505zHJ7knKraMsw+25jmnO6+fTpemeTt02qLTrL3Iuf8SpKnbVndkeSeSR6SudUXW1VV\nv5jk1u6+erE+3X1W5gKR7LPfgb2NugEAANjD7dJAoaqOTPKkJId1961VdVGSjUkWXeq/A26bft6e\n6Xq6+6+mRwXWJvlIVf1Od39ikRr3zlyYcHZ3n7u1Pkt4a5IPJvlO5n75X2yfg87capB/m1Y3bK9v\nzTv+0yQXdvdR02qKixY5pzK3+uO6gXn+Y5ZYnQAAAAAL7epHHlYmuWkKEw5K8rjM/cX8CVX10CSp\nqh+b+n4zyf0WDtDdNye5acv+CEmenbnHCBZVVQ9L8sXufn2Sv07yqEX6VZI3J7m2u/9sO67nTjV2\n95czt0HjH2UuXNjiHkmOno5/M8mnppUP11fVMVvmrqpDtmPOLVYmuWE6Pn6xmpJckOSF07Wlqh69\n1KBVdY8kvxH7JwAAADBgVwcK5ydZUVXXJlmX5NIkX83cYw/nVtWV+cGjAR9MctSWTRkXjHNc5vYC\nuCpzbzV45Tbm/Y0kV1fVxiSPzNweDFvz+MwFFE+c9+rEpV7B+LYkZ0797jW1nZ3kX7p7/iMF30py\naFVdneSJ8+o9Nsnzp+u+Jsn2bpiYJK9O8n9U1RW588qSC5M8fMumjJlbybB3kquq6prp81KeMNX/\nxYFaAAAAWOaq2+Pwd0VVvSHJFd395nltt3T3fWdY1i61z34H9n7HvXbWZSwLm9etnXUJAADAMlNV\nG7p7zbb63R2bMu6xqmpD5lYjvGTWtQAAAMDdaVkEClX140k+vpWvfrm7v7aV/m/M3OMQ872uu+fv\nk5Dp9Y8/ZGR1QlWdmuSYBc3ndPertneM7ZjjKUlOX9B8fXcftbX+AAAAsC3LIlCYQoPtfrtCd79g\n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\nRhMoAAAAAKMJFAAAAIDRBAoAAADAaAIFAAAAYDSBAgAAADCaQAEAAAAYTaAAAAAAjCZQAAAAAEbb\nLgKFqjqkqh4z9fdRVfWCzRjnKVW1bvh3Y1V9Ydg+rapWVtVbtmzlt5n7DVX1+aq6oqrOqqp7Te17\n/9D+is0Y9zbXZpY+r6yqq4c5zquqB03tu2Xqmnxk7PwAAADsnJYsdgELdEiSG5P8U5J098mbM0h3\nn5vk3CSpqguSHNvda6a6rJnpuC3kk0n+qLt/UlUnJvmjJK+qqv+W5JHd/TObOe4hmbo2s7gsycru\nvqmqfjfJ65M8e9j3w+5esZlzAwAAsJNa1BUKVfWhqlpbVVdV1ZFD21Or6tKqunz4NX15kqOSvGL4\nFf3gqjqhqo4d+q+oqkumfvm/99B+QVWdWFWfq6ovVtXB89RySFX9/bB9QlW9t6ourqp/rapfr6rX\nV9X6qjqnqnYd+h1YVRcO53BuVS2bbfzu/kR3/2T485Ikew7bn0iyx9S5PXSYY+0w/97DXE+rqs9W\n1WVV9Q9V9YCZrs0sc5/f3TfNMPeCVdWRVbWmqtbcctMNYw8HAABgB7PYtzy8uLsPTLIyyTFV9YAk\n70zyjO7eP8nh3b0hyclJ3tTdK7r74k3GOC3Jq7p7vyTrk7xmat+S7j4oycs3aV+IhyZ5QpJDk7wv\nyfndvW+SHyZZNYQKb03yzOEcTk3yuoWed5KPD9uHJvny1LmdkuToYcxjk7x96PePSR7V3Qck+dsk\nf7iAazOTl0zNnSR3GYKCS6rq12Y7qLtP6e6V3b1yl7stXeBpAgAAsKNa7Fsejqmqw4btByY5MslF\n3X1tknT3t+c6uKqWJrlXd184NL03yRlTXc4cPtcmWT6yto9394+ran2SXZKcM7SvH8b62SSPSPLJ\nqsrQ52vzDVpVxyf5SZLTZ9h3jySPSXLGMGaS7DZ87pnkA8MqiDsnuXbk+aSqnpdJePO4qeYHdff1\nVfWQJJ+qqvXd/eWxYwMAALBzWbRAoaoOSfKkJI8e7u2/IMm6JHtvwWluHj5vyfhzvTlJuvvWqvpx\nd/fQfuswViW5qrsfvdABq+qFSf5HkidOjTftTkm+O8szDd6a5I3d/ZHh2p2w0HmHuZ+U5Pgkj+vu\njdcl3X398PmV4f/ggCQCBQAAAOa0mLc8LE3ynSFM2DvJo5LcJckvVdWDk6Sq7jP0/X6S3TcdoLtv\n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\nr1nCmMdOtXy0qtZU1asH6rl7VT17kT6rq+rTVXVFVV1WVU9epP/zq+ouS60BAAAAtoVdIlBI8uwk\nR3f3cYPXrUqy1UAhyfeT/HGSU5Y45jOTPKu7H93d67v75M07VNWKBa69e2b3sjU3J3lqdx+S5HFJ\nXlVVd99K/+cnESgAAACwQ+30gUJVnZnkfkk+WFUvrqo3VtVnq+rzVfWEqc+qqrqwqi6Z/h0xXb4u\nyZFVtbGqXrCl8bv7pu7+ZGbBwmK1vDTJf03yhqp6RVUdVVV/P517WVW9raouSvK2qjpkqnPjtNLg\noKme+09tr1igni9195en4+uSfD3JPReo5+QkP5/ko9OKiWdU1avmnX9WVZ0+vT9fqKqzp9UV75pb\n1VBVD62qj1fVhqo6v6r2X+x9AAAAgJ0+UOjuk5Jcl+TRSfZN8pHuPnx6/Yqq2jezD91Hd/cvJXly\nkrnHEE5NcmF3r+7u07dBLX+aZH2S47r7D7fQ5YFJfrW7/88kJyU5o7tXJ1mT5Nqpnq9M9Wzp+p9Q\nVYcnuWOSryxQz6szvTfd/egkf5vkN6tq76nL05O8cTr+xSSv6+7/kuQ7SZ499fvLJE/q7odOfV++\nQC0nVtX6qlp/6803LFY6AAAAu7mFlubvrH4tyeOrau7xhDsluU9mH6pfU1Wrk9ya5AHLVN/fdff3\npuNPJ3lxVd07ybnd/eWqWvJA00qBtyU5obt/tJRruvvGqvpIkt+oqquS7N3dm6pqVZJ/6e6Lpq5/\nk+TkJB9K8qAkH55q2yvJ9QuMfVaSs5Jkn/0P6iXfCAAAALulXS1QqCRP7O4v/kRj1cuS/GuSwzJb\ndbHo4wvbyU1zB9399qq6OMnaJB+oqt9L8tWlDFJVd0vy/iQv7u7PDNbw10n+KMkXkrxpXvvmIUBn\n9n5e0d2PGJwDAACAPdxO/8jDZs5P8tyavk6vqodM7SuTXD99k398Zt+0J8l3k+y3w6uc1Xa/JF+d\nHkt4b5IHL6WeqrpjkvOSvLW737WEqX5izO6+OMmBmW1G+Y55/e5TVXPBwVOSfDLJF5Pcc669qvau\nqkOWMCcAAAB7uF0tUPizJHsnuayqrpheJ8nrkpxQVZcmOTg/XilwWZJbq+rShTZlTJKquibJK5M8\nraquraoHboNafzvJ5VW1MbPHCt7a3d9MclFVXb7QpozTdY+aatk4/Vu9lXnOSvKhqvrovLa/TXJR\n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\nC6pqY1UdWVUvq6pTpv6rq+ozVXVZVZ1XVT8ztX+sqk6rqs9W1Zeq6sip/ZCpbeN0zUFbqq27r+/u\nS6bj7ya5KskBC9zHk5KsSXL2NO7aqnrPvPNHV9V50/GNVXX6dM8XVNU9p/b7V9WHpvfjwqo6eKH3\nrbuv6e7Lkvxokff3xKpaX1Xrb735hq11BQAAYA+w2wQKSZ7R3Q/N7MP4yVV1ryR/leSJ3X1YkmO7\n+5okZyY5vbtXd/eFm43x1iQv6u4HJ9mU5E/mnVvR3Ycnef689pOSnNHdq6d5r12syCnUeEiSi7d0\nvrvflWR9kuOmcT+Q5OC5sCDJ05O8cTreN8n67j4kycfn1XVWkudO78cpSV63WF2L6e6zuntNd6/Z\n6y4rb+9wAAAA7OJ2p0ceTq6qY6bjA5OcmOQT3X11knT3v2/t4qpameTu3f3xqektSc6Z1+Xc6e+G\nJKum408neXFV3TvJud395UXmuGuSdyd5fnd/Zyk31d1dVW9L8rtV9aYkj0gyt+fDj5K8czr+myTn\nTnMckeScqpobZp+lzAUAAABLtVsEClV1VJJfTfKI7r65qj6WZGOSBZf63wa3TH9vzfS+dffbq+ri\nJGuTfKCqfq+7P7JAjXtnFiac3d3nbqnPVrwpyfuSfD/JOd39wwX6dWarTr49rW4AAACA7WJ3eeRh\nZZJvTWHCwUkenuROSR5VVfdNkqr62anvd5Pst/kA3X1Dkm/N7Y+Q5PjMHiNYUFXdL8lXu/vVSd6b\n5MEL9Kskb0hyVXe/cgn38xM1dvd1mW3Q+JLMwoU5d0gy98sMT0nyyWnlw9VVdezc3FV12BLmBAAA\ngCXbXQKFDyVZUVVXJVmX5DNJvpHZYw/nVtWl+fGjAe9LcszcpoybjXNCkldU1WVJVif500Xm/e0k\nl1fVxiQPymwPhi15ZGYBxWOmeTdW1a9vZdw3Jzlz6nfnqe3sJP/S3VfN63dTksOr6vIkj5lX73FJ\nnjnd9xVJnrDQRFX1sKq6NsmxSf5nVV2xlboAAAAgSVLdvdw1sARV9Zokn+/uN8xru7G777qja9ln\n/4N6/xNetaOn3eauWbd2uUsAAADY6VTVhu5es1i/3WIPhd1dVW3IbDXCC5e7FgAAAEgECttUVd0j\nyQVbOPUr3f3NLfR/bWaPQ8x3RnfP3ych088//pSR1QlV9eLMHmuY75zufvlSxwAAAIA5AoVtaAoN\n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\n3AFz/jDJC7v7kqraL8mGqvpwd1+5QP+nJbk8yXU7oLa3z70HVfX4JK9M8rgdMC8AAAC7sN1mhUJV\nvaeqNkwrAE6c2h5XVZdU1aVVdUFVrUpyUpIXTN/IH1lVL6uqU6b+q6vqM1V1WVWdV1U/M7V/rKpO\nq6rPVtWXqurIqf2QqW3jdM1BW6qtu6/v7kum4+8muSrJAQvcx5OSrEly9jTu2qp6z7zzR1fVedPx\njVV1+nTPF1TVPaf2+1fVh6b348KqOnih9627vzPv5b5JeoG6Tqyq9VW1/tabb1hoOAAAAPYQu02g\nkOQZ3f3QzD6Mn1xV90ryV0me2N2HJTm2u69JcmaS07t7dXdfuNkYb03you5+cJJNSf5k3rkV3X14\nkufPaz8pyRndvXqa99rFipxCjYckuXhL57v7XUnWJzluGvcDSQ6eCwuSPD3JG6fjfZOs7+5Dknx8\nXl1nJXnu9H6ckuR1i9T0nKr6SpK/SHLyAnWd1d1runvNXndZudhtAgAAsJvbnQKFk6vq0iSfSXJg\nkhOTfKK7r06S7v73rV1cVSuT3L27Pz41vSXJo+Z1OXf6uyHJqun400n+qKpelOQ/d/f3Fpnjrkne\nneT5m60MWFB3d5K3Jfndqrp7kkck+eB0+kdJ3jkd/02S/zrNcUSSc6pqY5L/mWT/ReZ4bXffP8mL\nkrxkKXUBAACwZ9st9lCoqqOS/GqSR3T3zVX1sSQbkyy41P82uGX6e2um9627315VFydZm+QDVfV7\n3f2RBWrcO7Mw4ezuPndLfbbiTUnel+T7Sc7p7h8u0K8zC4m+Pa1uGPW/krz+NlwHAADAHmZ3WaGw\nMsm3pjDh4CQPT3KnJI+qqvsmSVX97NT3u0n223yA7r4hybfm9kdIcnxmjxEsqKrul+Sr3f3qJO9N\n8uAF+lWSNyS5qrtfuYT7+Ykau/u6zDZofElm4cKcOyR50nT8lCSfnFY+XF1Vx87NXVWHbeUe5u/7\nsDbJl5dQHwAAAHu43SVQ+FCSFVV1VZJ1mT328I3MHns4d3oUYu7RgPclOWZuU8bNxjkhySuq6rIk\nq5P86SLz/naSy6dHCx6U2R4MW/LIzAKKx0zzbqyqX9/KuG9OcubU785T29lJ/qW7r5rX76Ykh1fV\n5UkeM6/e45I8c7rvK5I8YStz/f60qePGJH+Q2XsAAAAAW1WzR/TZ2VXVa5J8vrvfMK/txu6+646u\n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\nf6CqXl1VW6rqqqo6dieXBwAAwF5q1UoXMMexSW5J8uEk6e5zd8Oc307y7O6+sqoOTrKpqv6xuz+5\nQP+Tk1yT5HO7obb/UFWruvvbC3y8NgnQYXsAACAASURBVMm6JO/ZgaFPSZLuPrKqfjTJe6vqwd19\nxw6WCgAAwD5il69QqKq3VdWmaQXAqVPbo6rqyumv4hdX1ZokpyV5VlVtrqpjqur5VfWcqf/aqvpo\nVV1dVRdW1Q9N7ZdW1ZlV9bGq+nRVHTO1HzG1bZ7OOXy+2rr789195XR8c5Lrkhy6wHU8PrMf7udP\n466vqrfN+fyRVXXhdHxLVZ09XfPFVfUjU/t9qup90/dxWVXdd5Hv7TVVdW5VXZHkL6vq6Kr6SFV9\noqo+XFU/U1U/kOQFSX5jquk3quqgqnrVdP2fqKrHLvLPc78kl0zX/4UkX5mucb56Tq2qjVW18fZb\nb1pkSAAAAPYFu+OWh9/u7gdl9kP1mVX1Y0n+LsnjuvuoJE/o7q1Jzk1ydnev7e7LthvjdUme290P\nSLIlyZ/O+WxVdx+d5PQ57aclOae7t/31/salipxCjQcmuWK+z7v7LUk2JjlhGvc9Se67LSxI8tQk\nr5qOD0qysbuPSPKBOXWdl+QZ0/fxnCQvX6KseyV5aHf/1ySfSnJMdz8wyZ8k+Yvu/uZ0/Kbpe3tT\nkjOSXDJ9Jw9PclZVHbTA+FcleUxVraqqn0ryoCSHLXD953X3uu5et9/dVi9RNgAAAHu73XHLwzOr\n6vjp+LAkpyb5YHffkCTd/e+LnVxVq5Pco7s/MDW9Nsmb53S5YHrdlGTNdPyRJGdU1b2SXNDdn1li\njrsneWuS07v7q8u5qO7uqnp9kt+qqlcneUiSbXs+3JHkTdPxG5JcMM3x0CRvrqptwxywxDRv7u7b\np+PVSV47rbboJPsvcM4vZxYSPGd6f2CSn8hs9cX2XpXkZzMLSv5XZreb3D5PPwAAAPguuzRQmDb5\n+6UkD+nuW6vq0iSbkyy41H8H3Da93p7perr7jdOtAuuTvKeqfqe7L1mgxv0zCxPO7+4L5uuziFcn\neWeSb2T243+hfQ46s9UgX5lWNyzX1+Yc/3mS93f38dNqiksXOKcyW/3xz0sNPtX7rP84serDST49\nUB8AAAD7qF19y8PqJF+ewoT7Jvn5zP5i/gvTEvtU1Q9PfW9OcvD2A3T3TUm+vG1/hCQnZnYbwYKq\n6t5Jru/ulyR5e5IHLNCvkrwyyXXd/VfLuJ7vqrG7P5fZBo1/lFm4sM1dkjx+On5ykg9NKx9uqKon\nbJu7qo5axpzbrE7y2en45IVqSnJRkmdM15aqeuBCA1bV3bbdDlFVj0zy7UU2pAQAAID/sKsDhfcl\nWVVV1yXZkOSjSb6Y2W0PF1TVVfnOrQHvTHL8tk0ZtxvnpMz2Arg6s6cavGCJeZ+Y5Jqq2pzk/pnt\nwTCfh2UWUBw3zbt5iUcwvibJuVO/u05t5yf51+6ee0vB15IcXVXXJDluTr0nJHnadN3XJllsw8Tt\n/WWS/15Vn8h3ryx5f5L7bduUMbOVDPsnubqqrp3eL+RHk1w5/fs8N7PvAgAAAJZU3b3SNezRquql\nST7R3a+c03ZLd999BcvapQ445PA+5KQXr3QZi9q6Yf1KlwAAALBHqqpN3T3vEwDn2h2bMu61qmpT\nZqsRnr3StQAAAMDutE8EClV1zyQXz/PRI7r7S/P0f1lmt0PMdU53z90nIdPjH7/HyOqEqjojyRO2\na35zd79ouWMsY45fSXLmds03dPfx8/UHAACApewTgcIUGiz76Qrd/fRdWM72c70oyU4LDxaY46LM\nNmsEAACAnWJXb8oIAAAA7IUECgAAAMAwgQIAAAAwTKAAAAAADBMoAAAAAMP2iac8sHMdeejqbNyw\nfqXLAAAAYAVZoQAAAAAMEygAAAAAwwQKAAAAwDCBAgAAADBMoAAAAAAMEygAAAAAwwQKAAAAwDCB\nAgAAADBMoAAAAAAMEygAAAAAwwQKAAAAwDCBAgAAADBMoAAAAAAMEygAAAAAwwQKAAAAwDCBAgAA\nADBMoAAAAAAMEygAAAAAwwQKAAAAwDCBAgAAADBMoAAAAAAMEygAAAAAwwQKAAAAwDCBAgAAADBM\noAAAAAAMEygAAAAAwwQKAAAAwDCBAgAAADBMoAAAAAAMW7XSBbDn2fLZm7Lmee9e6TK+x9YN61e6\nBAAAgH2GFQoAAADAMIECAAAAMEygAAAAAAwTKAAAAADDBAoAAADAMIECAAAAMEygAAAAAAwTKAAA\nAADDBAoAAADAMIECAAAAMEygAAAAAAwTKAAAAADDdlugUFXPr6rn7K75dqWqOqyq3l9Vn6yqa6vq\n97f7/BlV9anps79cZJwTqmrznP/uqKq1u/4KAAAA4PuzaqUL2EN9O8mzu/vKqjo4yaaq+sfu/mRV\nPTzJY5Mc1d23VdWPLjRId5+f5Pwkqaojk7ytuzfvjgsAAACA78cuXaFQVWdU1aer6kNJfmZqO6Wq\nPl5VV1XVW6vqblV1cFXdUFX7T31+cO77eca9tKrOrKqPTeMfM7WfXFUvndPvXVV17HR8S1WdNa0a\n+KeqOnoa5/qqeszU54hpzM1VdXVVHT7f/N39+e6+cjq+Ocl1SQ6dPv5/kmzo7tumz7+wzK/rN5P8\nv4t1mK7hRdN399Gq+rGp/TVV9fi5/abXY6vqA1X19uk6N0yrIj5WVVuq6j5TvydU1TXTuB9cYO5T\nq2pjVW28/dablnlJAAAA7K12WaBQVQ9K8qQka5M8OsmDp48u6O4Hd/dRmf0Qf9r0o/zSJOunPk+a\n+n1rkSlWdffRSU5P8qfLKOmgJJd09xFJbk7ywiSPTHJ8khdMfU5Lck53r02yLsmNy7jONUkemOSK\nqemnkxxTVVdMP+YfvNC52/mNJH+/jGv46PTdfTDJKcsY96jMrutnk5yY5Ken7+0VSZ4x9fmTJL8y\njfuY+Qbp7vO6e113r9vvbquXMS0AAAB7s125QuGYJBd2963d/dUk75ja719Vl1XVliQnJDlian9F\nkqdOx09N8uolxr9get2UZM0y6vlmkvdNx1uSfGAKLLbMOf8jSf6wqp6b5Ce7++uLDVhVd0/y1iSn\nT9eYzG4j+eEkP5/kD5L8Q1XVEuP8XJJbu/uaZVzDu6bj5V73x6cVFbcl+Zck/2Nqn3vdlyd5TVWd\nkmS/ZYwJAADAPm4lnvLwmiS/191HJvmzJAcmSXdfnmTNdIvCfsv4cX3b9Hp7vrMXxLfz3dd04Jzj\nb3V3T8d3bDu/u+/Ydn53vzGzv9B/Pcl7quq4hSafbsd4a5Lzu/uCOR/dmNnqiu7uj01z/aclruVJ\nWXp1wvbXMO91V9VdkvzAnHNum3N8x5z3c6/7tCR/lOSwzPaDuOcyagEAAGAftisDhQ8m+fWquuu0\nceGvTe0HJ/n89IP8hO3OeV2SN2bp1QkL2ZpkbVXdpaoOS3L0yMlVde8k13f3S5K8PckDFuhXSV6Z\n5Lru/qvtPn5bkodP/X46sx/3/7bInHdJ8sQssX/CErYmedB0/Jgk8+49sUgN9+nuK7r7T5J8MbNg\nAQAAABa0ywKFadPCNyW5Ksl7k3x8+uiPM9tv4PIkn9rutPOT/FCW99f6+Vye5IYkn0zykiRXDp7/\n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\nAAAMEygAAAAAwwQKAAAAwDCBAgAAADBMoAAAAAAMEygAAAAAwwQKAAAAwDCBAgAAADBMoAAAAAAM\nEygAAAAAwwQKAAAAwDCBAgAAADBMoAAAAAAMEygAAAAAwwQKAAAAwDCBAgAAADBMoAAAAAAMEygA\nAAAAwwQKAAAAwDCBAgAAADBMoAAAAAAMEygAAAAAw1atdAHsebZ89qased67V7qMJMnWDetXugQA\nAIB9khUKAAAAwDCBAgAAADBMoAAAAAAMEygAAAAAwwQKAAAAwDCBAgAAADBMoAAAAAAMEygAAAAA\nwwQKAAAAwDCBAgAAADBMoAAAAAAMEygAAAAAw/a5QKGqjq2qh855f1pVPWUXz3lYVb2/qj5ZVddW\n1e8v0f/kqvrxXVnTnLn+61TX1VV1cVX95O6YFwAAgD3bPhcoJDk2yX8ECt19bne/bhfP+e0kz+7u\n+yX5+SRPr6r7LdL/5CS7JVBI8okk67r7AUnekuQvd9O8AAAA7MH2mkChqt5WVZumFQCnTm2Pqqor\nq+qq6a/va5KcluRZVbW5qo6pqudX1XOm/mur6qPTX+svrKofmtovraozq+pjVfXpqjpmaj9iats8\nnXP4fLV19+e7+8rp+OYk1yU5dIHreHySdUnOn8ZdX1Vvm/P5I6vqwun4lqo6e7rmi6vqR6b2+1TV\n+6bv47Kquu9C31t3v7+7b53efjTJvRao69Sq2lhVG2+/9aaFhgMAAGAfsdcECkl+u7sflNmP8WdW\n1Y8l+bskj+vuo5I8obu3Jjk3ydndvba7L9tujNclee701/otSf50zmeruvvoJKfPaT8tyTndvXaa\n98alipxCjQcmuWK+z7v7LUk2JjlhGvc9Se67LSxI8tQkr5qOD0qysbuPSPKBOXWdl+QZ0/fxnCQv\nX6quydOSvHeBus7r7nXdvW6/u61e5nAAAADsrVatdAE70TOr6vjp+LAkpyb5YHffkCTd/e+LnVxV\nq5Pco7s/MDW9Nsmb53S5YHrdlGTNdPyRJGdU1b2SXNDdn1lijrsneWuS07v7q8u5qO7uqnp9kt+q\nqlcneUiSbXs+3JHkTdPxG5JcMM3x0CRvrqptwxyw1DxV9VuZhSK/uJy6AAAA2LftFYFCVR2b5JeS\nPKS7b62qS5NsTrLgUv8dcNv0enum762731hVVyRZn+Q9VfU73X3JAjXun1mYcH53XzBfn0W8Osk7\nk3wjyZu7+9sL9OvMVp18ZVrdsCxV9UtJzkjyi91921L9AQAAYG+55WF1ki9PYcJ9M9v48MAkv1BV\nP5UkVfXDU9+bkxy8/QDdfVOSL2/bHyHJiZndRrCgqrp3kuu7+yVJ3p7kAQv0qySvTHJdd//VMq7n\nu2rs7s8l+VySP8osXNjmLkkePx0/OcmHppUPN1TVE7bNXVVHLXIND0zyt0ke091fWEZtAAAAsNcE\nCu9LsqqqrkuyIbPNBb+Y2W0PF1TVVfnOrQHvTHL8tk0ZtxvnpCRnVdXVSdYmecES8z4xyTVVtTnJ\n/TPbg2E+D8ssoDhumndzVT16kXFfk+Tcqd9dp7bzk/xrd183p9/XkhxdVdckOW5OvSckedp03dcm\neewic52V5O6Z3SKxuaresUhfAAAASJJUd690DSxDVb00ySe6+5Vz2m7p7rvv7loOOOTwPuSkF+/u\naee1dcP6lS4BAABgr1JVm7p73VL99oo9FPZ2VbUps9UIz17pWgAAACARKOxUVXXPJBfP89EjuvtL\n8/R/WWa3Q8x1TnfP3Sch0+Mfv8fI6oSqOiPJE7ZrfnN3v2i5YwAAAMA2AoWdaAoNlv10he5++i4s\nZ/u5XpREeAAAAMBOsbdsyggAAADsRgIFAAAAYJhAAQAAABgmUAAAAACGCRQAAACAYZ7ywLAjD12d\njRvWr3QZAAAArCArFAAAAIBhAgUAAABgmEABAAAAGCZQAAAAAIYJFAAAAIBhAgUAAABgmEABAAAA\nGCZQAAAAAIYJFAAAAIBhAgUAAABgmEABAAAAGCZQAAAAAIYJFAAAAIBhAgUAAABgmEABAAAAGCZQ\nAAAAAIYJFAAAAIBhAgUAAABgmEABAAAAGCZQAAAAAIYJFAAAAIBhAgUAAABgmEABAAAAGCZQAAAA\nAIYJFAAAAIBhAgUAAABgmEABAAAAGCZQAAAAAIYJFAAAAIBhq1a6APY8Wz57U9Y87927bb6tG9bv\ntrkAAABYHisUAAAAgGECBQAAAGCYQAEAAAAYJlAAAAAAhgkUAAAAgGECBQAAAGCYQAEAAAAYJlAA\nAAAAhgkUAAAAgGECBQAAAGCYQAEAAAAYJlAAAAAAhu1zgUJVHVtVD53z/rSqesounvOwqnp/VX2y\nqq6tqt9fov/JVfXju7KmOXP9xFTbJ6rq6qp69O6YFwAAgD3bqpUuYAUcm+SWJB9Oku4+dzfM+e0k\nz+7uK6vq4CSbquofu/uTC/Q/Ock1ST63G2r7oyT/0N1/U1X3S/KeJGt2w7wAAADswfaaFQpV9baq\n2jStADh1antUVV1ZVVdV1cVVtSbJaUmeVVWbq+qYqnp+VT1n6r+2qj46/aX+wqr6oan90qo6s6o+\nVlWfrqpjpvYjprbN0zmHz1dbd3++u6+cjm9Ocl2SQxe4jscnWZfk/Gnc9VX1tjmfP7KqLpyOb6mq\ns6drvriqfmRqv09VvW/6Pi6rqvsu8tV1kh+cjldngRCjqk6tqo1VtfH2W29aZDgAAAD2BXtNoJDk\nt7v7QZn9GH9mVf1Ykr9L8rjuPirJE7p7a5Jzk5zd3Wu7+7Ltxnhdkud29wOSbEnyp3M+W9XdRyc5\nfU77aUnO6e6107w3LlXkFGo8MMkV833e3W9JsjHJCdO470ly321hQZKnJnnVdHxQko3dfUSSD8yp\n67wkz5i+j+ckefkiJT0/yW9V1Y3TXM9YoK7zuntdd6/b726rl7pMAAAA9nJ7U6DwzKq6KslHkxyW\n5NQkH+zuG5Kku/99sZOranWSe3T3B6am1yb5hTldLpheN+U7twR8JMkfVtVzk/xkd399iTnunuSt\nSU7v7q8u56K6u5O8PrMf/fdI8pAk750+viPJm6bjNyT5L9McD03y5qranORvkxyyyBS/meQ13X2v\nJI9O8vqq2pv+vwAAAGAX2Cv2UKiqY5P8UpKHdPetVXVpks1JFlvqP+q26fX2TN9bd7+xqq5Isj7J\ne6rqd7r7kgVq3D+zMOH87r5gvj6LeHWSdyb5RpI3d/e3F+jXmYVEX5lWNyzH05I8Kkm6+yNVdWCS\n/5TkC4M1AgAAsA/ZW/4SvTrJl6cw4b5Jfj7JgUl+oap+Kkmq6oenvjcnOXj7Abr7piRf3rY/QpIT\nM7uNYEFVde8k13f3S5K8PckDFuhXSV6Z5Lru/qtlXM931djdn8tsb4M/yixc2OYuSR4/HT85yYem\nlQ83VNUTts1dVUctMtf/l+QRU9+fzex7++IyagQAAGAftrcECu9LsqqqrkuyIbPbHr6Y2W0PF0y3\nQmy7NeCdSY7ftinjduOclOSsqro6ydokL1hi3icmuWa6teD+me3BMJ+HZRZQHDfNu3mJxzO+Jsm5\nU7+7Tm3nJ/nX7r5uTr+vJTm6qq5Jctycek9I8rTpuq9N8thF5np2klOmvn+f5OTpNgsAAABYUPnt\nuGeoqpcm+UR3v3JO2y3dfffdXcsBhxzeh5z04t0239YN63fbXAAAAPu6qtrU3euW6rdX7KGwt6uq\nTZmtRnj2StcCAAAAiUBhp6qqeya5eJ6PHtHdX5qn/8syux1irnO6e+4+CZke//g9RlYnVNUZSZ6w\nXfObu/tFyx0DAAAAthEo7ERTaLDcpyuku5++C8vZfq4XJREeAAAAsFPsLZsyAgAAALuRQAEAAAAY\nJlAAAAAAhgkUAAAAgGECBQAAAGCYQAEAAAAY5rGRDDvy0NXZuGH9SpcBAADACrJCAQAAABgmUAAA\nAACGCRQAAACAYQIFAAAAYJhAAQAAABgmUAAAAACGCRQAAACAYQIFAAAAYJhAAQAAABgmUAAAAACG\nCRQAAACAYQIFAAAAYJhAAQAAABgmUAAAAACGCRQAAACAYQIFAAAAYJhAAQAAABgmUAAAAACGCRQA\nAACAYQIFAAAAYJhAAQAAABgmUAAAAACGCRQAAACAYQIFAAAAYJhAAQAAABgmUAAAAACGCRQAAACA\nYQIFAAAAYJhAAQAAABi2aqULYM+z5bM3Zc3z3r3Tx926Yf1OHxMAAIBdwwoFAAAAYJhAAQAAABgm\nUAAAAACGCRQAAACAYQIFAAAAYJhAAQAAABgmUAAAAACGCRQAAACAYQIFAAAAYJhAAQAAABgmUAAA\nAACGCRQAAACAYft0oFBVz6yq66rq/MHz1lTVk5fo88iq2lRVW6bX4+Z89qCp/X9W1Uuqqnb0GuaM\n+eEdPO+4qrqyqq6pqtdW1arvtxYAAAD2fvt0oJDkd5M8srtPGDxvTZJFA4Uk/5bk17r7yCQnJXn9\nnM/+JskpSQ6f/nvU4Pzfo7sfOnpOVd0lyWuTPKm775/kf021AgAAwKL22UChqs5Ncu8k762qM6rq\nVVX1sar6RFU9duqzpqoum/6Cf2VVbfvRviHJMVW1uaqeNd/43f2J7v7c9PbaJHetqgOq6pAkP9jd\nH+3uTvK6JL++SJ2XVtXZVbVxWk3x4Kq6oKo+U1UvnNPvlun12Omct1TVp6rq/EVWQNwzyTe7+9PT\n+39M8rgF6jh1qmHj7bfetFC5AAAA7CP22UChu09L8rkkD09yUJJLuvvo6f1ZVXVQki9ktoLhPyf5\njSQvmU5/XpLLunttd5+9jOkel+TK7r4tyaFJbpzz2Y1T22K+2d3rkpyb5O1Jnp7k/klOrqp7ztP/\ngUlOT3K/zEKThy0w7r8lWVVV66b3j09y2Hwdu/u87l7X3ev2u9vqJcoFAABgb+d++ZlfTvKYqnrO\n9P7AJD+RWeDw0qpam+T2JD89pHTMkgAAEV9JREFUOnBVHZHkzGmOHfWO6XVLkmu7+/PT2NdnFgB8\nabv+H+vuG6c+mzO7ReND2w/a3V1VT0pydlUdkOR/ZHadAAAAsCiBwkwleVx3//N3NVY9P8n/SXJU\nZqs5vjE0aNW9klyY5Cnd/S9T82eT3GtOt3tNbYu5bXq9Y87xtvfz/RvO7XP7An2SJN39kSTHTPX+\ncnYgNAEAAGDfs8/e8rCdi5I8Y9teA1X1wKl9dZLPd/cdSU5Mst/UfnOSgxcbsKrukeTdSZ7X3Zdv\na59WF3y1qn5+mu8pmd3GsCKq6ken1wOSPDez2yoAAABgUQKFmT9Psn+Sq6vq2ul9krw8yUlVdVWS\n+yb52tR+dZLbq+qqhTZlTPJ7Sf6vJH8ybd64eduP98yeLvGKJP8zyb8kee9Ov6Ll+4Oqui6za3pn\nd1+ygrUAAACwh6jZgwZg+Q445PA+5KQX7/Rxt25Yv9PHBAAAYExVbZoeDLAoKxQAAACAYTZl/D5V\n1a9k9hSHuW7o7uMHx3lZvvfxjud096u/n/rmjH9hkp/arvm53X3RzhgfAACAfYtA4fs0/SD/vn+U\nd/fTd0I5i40/FHAAAADAYtzyAAAAAAwTKAAAAADDBAoAAADAMIECAAAAMEygAAAAAAzzlAeGHXno\n6mzcsH6lywAAAGAFWaEAAAAADBMoAAAAAMMECgAAAMAwgQIAAAAwTKAAAAAADBMoAAAAAMMECgAA\nAMAwgQIAAAAwTKAAAAAADBMoAAAAAMMECgAAAMAwgQIAAAAwTKAAAAAADBMoAAAAAMMECgAAAMAw\ngQIAAAAwTKAAAAAADBMoAAAAAMMECgAAAMAwgQIAAAAwTKAAAAAADBMoAAAAAMMECgAAAMAwgQIA\nAAAwTKAAAAAADBMoAAAAAMMECgAAAMAwgQIAAAAwTKAAAAAADFu10gWw59ny2Zuy5nnv3uHzt25Y\nvxOrAQAAYCVYoQAAAAAMEygAAAAAwwQKAAAAwDCBAgAAADBMoAAAAAAMEygAAAAAwwQKAAAAwDCB\nAgAAADBMoAAAAAAMEygAAAAAwwQKAAAAwDCBAgAAADBMoLADqur5VfWcla4DAAAAVopAAQAAABgm\nUFimqjqjqj5dVR9K8jNT2ylV9fGquqqq3lpVd6uqg6vqhqraf+rzg3PfzzPupVV1ZlV9bBr/mKn9\n5Kp66Zx+76qqY6fjW6rqrKq6tqr+qaqOnsa5vqoeM/U5Yhpzc1VdXVWHLzD/C6rq9DnvX1RVvz9P\nv1OramNVbbz91pt29GsEAABgLyFQWIaqelCSJyVZm+TRSR48fXRBdz+4u49Kcl2Sp3X3zUkuTbJ+\n6vOkqd+3FpliVXcfneT0JH+6jJIOSnJJdx+R5OYkL0zyyCTHJ3nB1Oe0JOd099ok65LcuMBYr0ry\nlOk67zLV+4btO3X3ed29rrvX7Xe31csoEQAAgL3ZqpUuYA9xTJILu/vWJKmqd0zt96+qFya5R5K7\nJ7loan9Fkv+W5G1JnprklCXGv2B63ZRkzTLq+WaS903HW5Lc1t3fqqotc87/SJIzqupemQUan5lv\noO7eWlVfqqoHJvmxJJ/o7i8towYAAAD2YVYofH9ek+T3uvvIJH+W5MAk6e7Lk6yZblHYr7uvWWKc\n26bX2/OdkOfb+e5/nwPnHH+ru3s6vmPb+d19x7bzu/uNSR6T5OtJ3lNVxy0y/yuSnJxZ+PGqJWoF\nAAAAgcIyfTDJr1fVXavq4CS/NrUfnOTz0/4IJ2x3zuuSvDHJq3dwzq1J1lbVXarqsCRHj5xcVfdO\ncn13vyTJ25M8YJHuFyZ5VGa3cly0SD8AAABI4paHZenuK6vqTUmuSvKFJB+fPvrjJFck+eL0evCc\n087PbG+Dv9/BaS9PckOST2a2P8OVg+c/McmJVfWtJP87yV8s1LG7v1lV70/yle6+fQfrBQAAYB9S\n31k5z85UVY9P8tjuPnGla1nKtBnjlUmesNBeC3MdcMjhfchJL97h+bZuWL90JwAAAFZEVW3q7nVL\n9bNCYReoqr9O8quZPRHiTq2q7pfkXZltOrlkmAAAAACJQGGX6O5nbN9WVS9L8rDtms/p7h3dY2FI\nVd0zycXzfPSI7r737qgBAACAvYdAYTfp7qev8PxfSrJ2JWsAAABg7+EpDwAAAMAwgQIAAAAwTKAA\nAAAADBMoAAAAAMMECgAAAMAwT3lg2JGHrs7GDetXugwAAABWkBUKAAAAwDCBAgAAADBMoAAAAAAM\nEygAAAAAwwQKAAAAwDCBAgAAADBMoAAAAAAMEygAAAAAwwQKAAAAwDCBAgAAADBMoAAAAAAMEygA\nAAAAwwQKAAAAwDCBAgAAADBMoAAAAAAMEygAAAAAwwQKAAAAwDCBAgAAADBMoAAAAAAMEygAAPD/\nt3fvMXKVZRzHvz+tohEFxcaoIK2CwdZLDRsUBCSoiBKDCBjv1wQbrxhJQFRUEu9G1ABBDCggRkUB\nMYr+wU0wim6hXEpTwy1RMZGbQL2ghcc/5l0d6nbbs9OdYWe/n6TZ2fe8M+c5k6czu78571lJkjoz\nUJAkSZIkSZ0ZKEiSJEmSpM4MFCRJkiRJUmcGCpIkSZIkqTMDBUmSJEmS1JmBgiRJkiRJ6sxAQZIk\nSZIkdWagIEmSJEmSOjNQkCRJkiRJnRkoSJIkSZKkzgwUJEmSJElSZwYKkiRJkiSpMwMFSZIkSZLU\nmYGCJEmSJEnqzEBBkiRJkiR1ZqAgSZIkSZI6M1CQJEmSJEmdGShIkiRJkqTODBQkSZIkSVJnBgqS\nJEmSJKkzAwVJkiRJktSZgYIkSZIkSepswQUKSfZLslff9yuTvG2O97lTkkuS3JBkTZIPbWb+O5I8\nbS5r6tvXzkkuSnJtkkuT7DiM/UqSJEmS5rcFFygA+wH/DRSq6pSqOnOO97kB+EhVLQNeDLwvybIZ\n5r8DGEqgAHwZOLOqng8cD3xuSPuVJEmSJM1jYxMoJDk/yap2BsARbezAJFcluaZ9Cr8EWAl8OMnq\nJPsk+VSSo9r8FUl+0z6tPy/JE9v4pUm+kOS3SX6fZJ82vryNrW732XW62qrqz1V1Vbt9H7AWePom\njuMwYAI4uz3uQUnO79v+iiTntdvrk5zQjvmiJIvb+LOS/Lw9H5cn2W2Gp24ZcHG7fQlw8OafbUmS\nJEnSQjc2gQLwrqrand4v4x9M8hTgm8ChVfUC4PCquhU4BTihqlZU1eUbPcaZwNHt0/rrgE/2bVtU\nVXsAR/aNrwS+VlUr2n7/uLkiW6jxQuDK6bZX1Q+BSeDN7XF/Buw2FRYA7wROb7cfB0xW1XLgsr66\nTgU+0J6Po4CTZyjpGuB17fYhwOOT7DBN3UckmUwyefvtt2/uMCVJkiRJY26cAoUPJrkG+A2wE3AE\n8MuqugWgqu6a6c5JtgO2r6rL2tAZwL59U85tX1cBS9rtXwPHJjka2Lmq/rGZfWwL/Ag4sqru3ZKD\nqqoCzgLekmR7YE/gwrb5QeD77fZ3gL3bPvYCzkmyGvgG8NQZdnEU8NIkVwMvBf4EPDBNHadW1URV\nTSxevHjjzZIkSZKkBWbRqAvYGpLsB7wc2LOq/p7kUmA1MNOp/l3d374+QHvequq7Sa4EDgJ+luQ9\nVXXxdHdO8ih6YcLZVXXudHNm8C3gJ8A/gXOqasMm5hW9kOiv7eyGzaqq22hnKLQw4tCq+mvH+iRJ\nkiRJC8y4nKGwHXB3CxN2o3fhw8cA+yZZCpDkSW3ufcDjN36AqroHuHvq+gjAW+ktI9ikJM8Ebq6q\nrwM/Bp6/iXkBTgPWVtVXtuB4HlJj+6X/NuDj9MKFKY8ADmu33wRc0c58uCXJ4VP7TvKCGY7hyUmm\n+uCj/G85hSRJkiRJmzQugcLPgUVJ1gKfp7fs4XZ6yx7ObUshppYG/AQ4ZOqijBs9ztuBLyW5FlhB\n768ezOT1wPVtacFz6V2DYTovoRdQ7N/2uzrJq2d43G8Dp7R5j21jZwN/qKq1ffP+BuyR5Hpg/756\n3wy8ux33Gma+0OJ+wLokvweeAnxmhrmSJEmSJAGQ3hJ9PdwlORG4uqpO6xtbX1XbDruWiYmJmpyc\nHPZuJUmSJElDkGRVVU1sbt5YXENh3CVZRe9shI+MuhZJkiRJksBAYatqf27xomk2vayq7pxm/kn0\nlkP0+1pV9V8ngfbnH/9Pl7MTknwMOHyj4XOqyiUOkiRJkqTOXPKgzlzyIEmSJEnja0uXPIzLRRkl\nSZIkSdIQGShIkiRJkqTODBQkSZIkSVJnBgqSJEmSJKkzAwVJkiRJktSZgYIkSZIkSerMQEGSJEmS\nJHVmoCBJkiRJkjozUJAkSZIkSZ0ZKEiSJEmSpM4MFCRJkiRJUmcGCpIkSZIkqTMDBUmSJEmS1JmB\ngiRJkiRJ6sxAQZIkSZIkdWagIEmSJEmSOjNQkCRJkiRJnRkoSJIkSZKkzgwUJEmSJElSZwYKkiRJ\nkiSpMwMFSZIkSZLUWapq1DVonklyH7Bu1HVowXoycMeoi9CCZf9plOw/jZL9p1Gy/4Zv56pavLlJ\ni4ZRicbOuqqaGHURWpiSTNp/GhX7T6Nk/2mU7D+Nkv338OWSB0mSJEmS1JmBgiRJkiRJ6sxAQbNx\n6qgL0IJm/2mU7D+Nkv2nUbL/NEr238OUF2WUJEmSJEmdeYaCJEmSJEnqzEBBkiRJkiR1ZqCgh0hy\nYJJ1SW5Mcsw027dJ8v22/cokS/q2fbSNr0vyymHWrfEw2/5LskOSS5KsT3LisOvWeBig/16RZFWS\n69rX/Yddu+a/AfpvjySr279rkhwy7No1/w3y81/b/oz2HnzUsGrW+Bjg9W9Jkn/0vQaeMuzaZaCg\nPkkeCZwEvApYBrwxybKNpr0buLuqdgFOAL7Q7rsMeAOwHDgQOLk9nrRFBuk/4J/AJwB/kNGsDNh/\ndwCvqarnAW8HzhpO1RoXA/bf9cBEVa2g9/77jSSLhlO5xsGA/TflK8CFc12rxs9W6L+bqmpF+7dy\nKEXrIQwU1G8P4Maqurmq/gV8Dzh4ozkHA2e02z8EXpYkbfx7VXV/Vd0C3NgeT9pSs+6/qvpbVV1B\nL1iQZmOQ/ru6qm5r42uAxybZZihVa1wM0n9/r6oNbfwxgFfbVleD/PxHktcCt9B7/ZO6Gqj/NHoG\nCur3dOAPfd//sY1NO6f9AHMPsMMW3leaySD9Jw1qa/XfocBVVXX/HNWp8TRQ/yV5UZI1wHXAyr6A\nQdoSs+6/JNsCRwOfHkKdGk+Dvv8uTXJ1ksuS7DPXxer/eUqcJElbQZLl9E7DPGDUtWhhqaorgeVJ\nngOckeTCqvKMLQ3Dp4ATqmq9HxhrBP4MPKOq7kyyO3B+kuVVde+oC1tIPENB/f4E7NT3/Y5tbNo5\nbY3mdsCdW3hfaSaD9J80qIH6L8mOwHnA26rqpjmvVuNmq7z+VdVaYD3w3DmrVONokP57EfDFJLcC\nRwLHJnn/XBessTLr/mtLre8EqKpVwE3As+e8Yj2EgYL6/Q7YNcnSJI+md5HFCzaacwG9i44BHAZc\nXFXVxt/QrsK6FNgV+O2Q6tZ4GKT/pEHNuv+SbA/8FDimqn41tIo1Tgbpv6VTF2FMsjOwG3DrcMrW\nmJh1/1XVPlW1pKqWAF8FPltV/rUldTHI69/iqYvAJ3kmvd8/bh5S3Wpc8qD/qqoNLVX+BfBI4PSq\nWpPkeGCyqi4ATgPOSnIjcBe9//S0eT8AbgA2AO+rqgdGciCalwbpP4D26cgTgEe3C0QdUFU3DPs4\nND8N2H/vB3YBjktyXBs7oKr+Mtyj0Hw1YP/tDRyT5N/Ag8B7q+qO4R+F5qtB33+lQQzYf/sCx/e9\n/q2sqruGfxQLW/xwT5IkSZIkdeWSB0mSJEmS1JmBgiRJkiRJ6sxAQZIkSZIkdWagIEmSJEmSOjNQ\nkCRJkiRJnRkoSJIkSZKkzgwUJEmSJElSZ/8Bfhk5EysUiyEAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fa2038973c8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "print(bst.feature_importances_)\n",
    "importance = bst.feature_importances_\n",
    "# importance = sorted(importance.items(),key= lambda x:x[1],reverse=False)\n",
    "df = pd.DataFrame({'feature':test_feat.columns,'fscore':importance})\n",
    "df = df.sort_values(by='fscore',ascending=1)\n",
    "df['fscore'] = df['fscore']/df['fscore'].sum()\n",
    "from matplotlib import pylab as plt\n",
    "plt.figure()\n",
    "# df.plot()\n",
    "df.plot(kind='barh', x='feature', y='fscore', legend=False, figsize=(16, 100))\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "80\n"
     ]
    }
   ],
   "source": [
    "columns = df['feature']\n",
    "print(len(columns))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "[207]\ttrain-auc:0.894088\teval-auc:0.873656\n",
    "[208]\ttrain-auc:0.89418\teval-auc:0.873639\n",
    "[209]\ttrain-auc:0.894217\teval-auc:0.873539\n",
    "Stopping. Best iteration:\n",
    "[204]\ttrain-auc:0.893661\teval-auc:0.873812\n",
    "\n",
    "[ 0.04932186  0.01056711  0.051603   ...,  0.80205029  0.04331443\n",
    "  0.09018628]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "66\n"
     ]
    }
   ],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {
    "collapsed": false,
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Index(['userid', 'actionType', 'actionTime'], dtype='object')\n",
      "1471119058\n"
     ]
    }
   ],
   "source": [
    "df =get_all_train_data()\n",
    "\n",
    "print(df.columns)\n",
    "print(df.actionTime.min())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0    NaN\n",
      "2    3.0\n",
      "Name: B, dtype: float64\n",
      "1    NaN\n",
      "3    2.0\n",
      "Name: B, dtype: float64\n",
      "   A  B\n",
      "0  1  0\n",
      "1  2  0\n"
     ]
    }
   ],
   "source": [
    "df = pd.DataFrame({'A':[1,2,1,2],'B':[5,6,8,8]})\n",
    "# print(df['A'][-1:])\n",
    "def get1(x):\n",
    "    x=x.diff()\n",
    "    print(x)\n",
    "    return x[-5:-4].sum()\n",
    "df_1 = df.groupby(['A'],as_index=False).agg({'B':get1})\n",
    "print(df_1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>userid</th>\n",
       "      <th>feat_3_mean</th>\n",
       "      <th>feat_3_min</th>\n",
       "      <th>feat_3_max</th>\n",
       "      <th>feat_3_std</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100000000013</td>\n",
       "      <td>2.126761</td>\n",
       "      <td>0.0</td>\n",
       "      <td>76.0</td>\n",
       "      <td>10.805081</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>100000000111</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>100000000127</td>\n",
       "      <td>16.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>43.0</td>\n",
       "      <td>22.011361</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>100000000231</td>\n",
       "      <td>4.627907</td>\n",
       "      <td>0.0</td>\n",
       "      <td>58.0</td>\n",
       "      <td>11.930400</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>100000000379</td>\n",
       "      <td>3.963855</td>\n",
       "      <td>0.0</td>\n",
       "      <td>46.0</td>\n",
       "      <td>8.230588</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>100000000393</td>\n",
       "      <td>1.702703</td>\n",
       "      <td>0.0</td>\n",
       "      <td>11.0</td>\n",
       "      <td>2.747371</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>100000000423</td>\n",
       "      <td>0.370703</td>\n",
       "      <td>0.0</td>\n",
       "      <td>188.0</td>\n",
       "      <td>7.359265</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>100000000459</td>\n",
       "      <td>0.785714</td>\n",
       "      <td>0.0</td>\n",
       "      <td>11.0</td>\n",
       "      <td>2.118879</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>100000000465</td>\n",
       "      <td>4.794872</td>\n",
       "      <td>0.0</td>\n",
       "      <td>83.0</td>\n",
       "      <td>18.541815</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>100000000471</td>\n",
       "      <td>14.142857</td>\n",
       "      <td>0.0</td>\n",
       "      <td>296.0</td>\n",
       "      <td>64.581952</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>100000000637</td>\n",
       "      <td>1.050000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>23.0</td>\n",
       "      <td>4.063281</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>100000000695</td>\n",
       "      <td>0.800000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>13.0</td>\n",
       "      <td>2.940795</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>100000000745</td>\n",
       "      <td>1.774194</td>\n",
       "      <td>0.0</td>\n",
       "      <td>41.0</td>\n",
       "      <td>7.401395</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>100000000755</td>\n",
       "      <td>2.500000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>10.0</td>\n",
       "      <td>5.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>100000000867</td>\n",
       "      <td>0.558824</td>\n",
       "      <td>0.0</td>\n",
       "      <td>37.0</td>\n",
       "      <td>3.918915</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>100000000949</td>\n",
       "      <td>0.133333</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.343776</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>100000000975</td>\n",
       "      <td>1.375000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>43.0</td>\n",
       "      <td>5.977420</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>100000001023</td>\n",
       "      <td>0.542500</td>\n",
       "      <td>0.0</td>\n",
       "      <td>28.0</td>\n",
       "      <td>2.160988</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>100000001195</td>\n",
       "      <td>11.000000</td>\n",
       "      <td>1.0</td>\n",
       "      <td>21.0</td>\n",
       "      <td>14.142136</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>100000001231</td>\n",
       "      <td>7.794118</td>\n",
       "      <td>0.0</td>\n",
       "      <td>70.0</td>\n",
       "      <td>17.898331</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>100000001295</td>\n",
       "      <td>4.736842</td>\n",
       "      <td>0.0</td>\n",
       "      <td>103.0</td>\n",
       "      <td>17.455247</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>100000001343</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>100000001505</td>\n",
       "      <td>1.825000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>78.0</td>\n",
       "      <td>9.533120</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>100000001557</td>\n",
       "      <td>1.761905</td>\n",
       "      <td>0.0</td>\n",
       "      <td>36.0</td>\n",
       "      <td>7.847960</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>100000001683</td>\n",
       "      <td>6.791667</td>\n",
       "      <td>0.0</td>\n",
       "      <td>79.0</td>\n",
       "      <td>18.745386</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>100000001711</td>\n",
       "      <td>1.261905</td>\n",
       "      <td>0.0</td>\n",
       "      <td>39.0</td>\n",
       "      <td>6.052855</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>100000001803</td>\n",
       "      <td>19.666667</td>\n",
       "      <td>0.0</td>\n",
       "      <td>198.0</td>\n",
       "      <td>50.423445</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>100000001955</td>\n",
       "      <td>0.080000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.400000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>100000001963</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>100000002111</td>\n",
       "      <td>0.269231</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.777570</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40277</th>\n",
       "      <td>114869267343</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40278</th>\n",
       "      <td>114869267443</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40279</th>\n",
       "      <td>114869267447</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40280</th>\n",
       "      <td>114869467148</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40281</th>\n",
       "      <td>114869467440</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40282</th>\n",
       "      <td>114869567147</td>\n",
       "      <td>0.093750</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.530330</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40283</th>\n",
       "      <td>114869567242</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40284</th>\n",
       "      <td>114869652742</td>\n",
       "      <td>0.137931</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.580895</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40285</th>\n",
       "      <td>114869667242</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40286</th>\n",
       "      <td>114869667840</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40287</th>\n",
       "      <td>114869669649</td>\n",
       "      <td>0.027778</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.166667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40288</th>\n",
       "      <td>114869767141</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40289</th>\n",
       "      <td>114869767649</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40290</th>\n",
       "      <td>114869769143</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40291</th>\n",
       "      <td>114869867143</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40292</th>\n",
       "      <td>114869867443</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40293</th>\n",
       "      <td>114869867749</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40294</th>\n",
       "      <td>114869967142</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40295</th>\n",
       "      <td>114869967540</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40296</th>\n",
       "      <td>114869967746</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40297</th>\n",
       "      <td>114869969143</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40298</th>\n",
       "      <td>114869969641</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40299</th>\n",
       "      <td>114869969842</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40300</th>\n",
       "      <td>114999082932</td>\n",
       "      <td>4.966667</td>\n",
       "      <td>0.0</td>\n",
       "      <td>134.0</td>\n",
       "      <td>18.995956</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40301</th>\n",
       "      <td>114999082935</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40302</th>\n",
       "      <td>114999280232</td>\n",
       "      <td>1.875000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>22.0</td>\n",
       "      <td>5.084610</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40303</th>\n",
       "      <td>114999480334</td>\n",
       "      <td>5.333333</td>\n",
       "      <td>0.0</td>\n",
       "      <td>17.0</td>\n",
       "      <td>7.366591</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40304</th>\n",
       "      <td>114999482932</td>\n",
       "      <td>19.636364</td>\n",
       "      <td>0.0</td>\n",
       "      <td>97.0</td>\n",
       "      <td>32.456965</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40305</th>\n",
       "      <td>114999582132</td>\n",
       "      <td>0.258621</td>\n",
       "      <td>0.0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>1.018433</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40306</th>\n",
       "      <td>114999782736</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>40307 rows × 5 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "             userid  feat_3_mean  feat_3_min  feat_3_max  feat_3_std\n",
       "0      100000000013     2.126761         0.0        76.0   10.805081\n",
       "1      100000000111     0.000000         0.0         0.0    0.000000\n",
       "2      100000000127    16.000000         0.0        43.0   22.011361\n",
       "3      100000000231     4.627907         0.0        58.0   11.930400\n",
       "4      100000000379     3.963855         0.0        46.0    8.230588\n",
       "5      100000000393     1.702703         0.0        11.0    2.747371\n",
       "6      100000000423     0.370703         0.0       188.0    7.359265\n",
       "7      100000000459     0.785714         0.0        11.0    2.118879\n",
       "8      100000000465     4.794872         0.0        83.0   18.541815\n",
       "9      100000000471    14.142857         0.0       296.0   64.581952\n",
       "10     100000000637     1.050000         0.0        23.0    4.063281\n",
       "11     100000000695     0.800000         0.0        13.0    2.940795\n",
       "12     100000000745     1.774194         0.0        41.0    7.401395\n",
       "13     100000000755     2.500000         0.0        10.0    5.000000\n",
       "14     100000000867     0.558824         0.0        37.0    3.918915\n",
       "15     100000000949     0.133333         0.0         1.0    0.343776\n",
       "16     100000000975     1.375000         0.0        43.0    5.977420\n",
       "17     100000001023     0.542500         0.0        28.0    2.160988\n",
       "18     100000001195    11.000000         1.0        21.0   14.142136\n",
       "19     100000001231     7.794118         0.0        70.0   17.898331\n",
       "20     100000001295     4.736842         0.0       103.0   17.455247\n",
       "21     100000001343     0.000000         0.0         0.0    0.000000\n",
       "22     100000001505     1.825000         0.0        78.0    9.533120\n",
       "23     100000001557     1.761905         0.0        36.0    7.847960\n",
       "24     100000001683     6.791667         0.0        79.0   18.745386\n",
       "25     100000001711     1.261905         0.0        39.0    6.052855\n",
       "26     100000001803    19.666667         0.0       198.0   50.423445\n",
       "27     100000001955     0.080000         0.0         2.0    0.400000\n",
       "28     100000001963     0.000000         0.0         0.0    0.000000\n",
       "29     100000002111     0.269231         0.0         3.0    0.777570\n",
       "...             ...          ...         ...         ...         ...\n",
       "40277  114869267343     0.000000         0.0         0.0    0.000000\n",
       "40278  114869267443     0.000000         0.0         0.0    0.000000\n",
       "40279  114869267447     0.000000         0.0         0.0    0.000000\n",
       "40280  114869467148     0.000000         0.0         0.0    0.000000\n",
       "40281  114869467440     0.000000         0.0         0.0         NaN\n",
       "40282  114869567147     0.093750         0.0         3.0    0.530330\n",
       "40283  114869567242     0.000000         0.0         0.0    0.000000\n",
       "40284  114869652742     0.137931         0.0         3.0    0.580895\n",
       "40285  114869667242     0.000000         0.0         0.0    0.000000\n",
       "40286  114869667840     0.000000         0.0         0.0    0.000000\n",
       "40287  114869669649     0.027778         0.0         1.0    0.166667\n",
       "40288  114869767141     0.000000         0.0         0.0    0.000000\n",
       "40289  114869767649     0.000000         0.0         0.0    0.000000\n",
       "40290  114869769143     0.000000         0.0         0.0    0.000000\n",
       "40291  114869867143     0.000000         0.0         0.0    0.000000\n",
       "40292  114869867443          NaN         NaN         NaN         NaN\n",
       "40293  114869867749     0.000000         0.0         0.0    0.000000\n",
       "40294  114869967142     0.000000         0.0         0.0    0.000000\n",
       "40295  114869967540     0.000000         0.0         0.0    0.000000\n",
       "40296  114869967746     0.000000         0.0         0.0    0.000000\n",
       "40297  114869969143     0.000000         0.0         0.0    0.000000\n",
       "40298  114869969641     0.000000         0.0         0.0    0.000000\n",
       "40299  114869969842     0.000000         0.0         0.0    0.000000\n",
       "40300  114999082932     4.966667         0.0       134.0   18.995956\n",
       "40301  114999082935     0.000000         0.0         0.0    0.000000\n",
       "40302  114999280232     1.875000         0.0        22.0    5.084610\n",
       "40303  114999480334     5.333333         0.0        17.0    7.366591\n",
       "40304  114999482932    19.636364         0.0        97.0   32.456965\n",
       "40305  114999582132     0.258621         0.0         6.0    1.018433\n",
       "40306  114999782736     0.000000         0.0         0.0    0.000000\n",
       "\n",
       "[40307 rows x 5 columns]"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(40307, 1)\n"
     ]
    }
   ],
   "source": [
    "print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1505087865\n"
     ]
    }
   ],
   "source": [
    "print(df.actionTime.min())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1478363873\n",
      "Index(['userid', 'orderid', 'orderTime', 'orderType', 'city', 'country',\n",
      "       'continent'],\n",
      "      dtype='object')\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "df = pd.read_csv('../data/train/orderHistory_train.csv')\n",
    "print(df.orderTime.min())\n",
    "print(df.columns)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#coding:UTF-8\n",
    "import time\n",
    "\n",
    "timestamp = 1462451334\n",
    "\n",
    "#转换成localtime\n",
    "time_local = time.localtime(timestamp)\n",
    "#转换成新的时间格式(2016-05-05 20:28:54)\n",
    "dt = time.strftime(\"%Y-%m-%d %H:%M:%S\",time_local)\n",
    "\n",
    "print dt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'datetime.datetime'>\n",
      "<class 'time.struct_time'>\n",
      "2\n",
      "<class 'str'>\n"
     ]
    }
   ],
   "source": [
    "import time\n",
    "import datetime\n",
    "timestamp = 1400000000\n",
    "t = datetime.datetime.fromtimestamp(timestamp)\n",
    "print(type(t))\n",
    "time_local = time.localtime(timestamp)\n",
    "print(type(time_local))\n",
    "# dt = time.strftime('%Y-%m-%d')\n",
    "print(t.weekday())\n",
    "print(type(time.asctime(time_local)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (tf)",
   "language": "python",
   "name": "env-tf"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
